从 CWA 1.5 升级到在 WebSphere 上运行的 CWA 2011 后,我的客户遇到了问题。问题是任何请求的二进制资源都会返回 404。当重新提交请求(即刷新/重新加载页面)时,它们会加载。
我无法访问他们的环境,必须通过第三方获取所有配置文件。我想知道是否有人对导致二进制文件出现这些 404 的原因有任何想法?
从 CWA 1.5 升级到在 WebSphere 上运行的 CWA 2011 后,我的客户遇到了问题。问题是任何请求的二进制资源都会返回 404。当重新提交请求(即刷新/重新加载页面)时,它们会加载。
我无法访问他们的环境,必须通过第三方获取所有配置文件。我想知道是否有人对导致二进制文件出现这些 404 的原因有任何想法?
从 Websphere 6.1 开始,IBM 更改了过滤器的行为,如果您调用的 URL 实际上在服务器上不存在,这些过滤器将不会执行。
这意味着对仍在数据库中的 /somefile.png 的请求将导致(技术上正确)404,但完全不是您对启用 CWA 的 Web 应用程序的期望。
解决方案是让过滤器在没有 servlet 映射的情况下调用请求,您应该能够在 WebSphere 管理控制台中执行以下操作:
自从我使用 CWA 已经很久了,但是 IIRC 它会根据请求将二进制文件序列化到磁盘,并将它们缓存起来以备将来使用。听起来这个过程花费的时间太长了,所以你得到一个 404 的第一个二进制请求。我以前在 WebSphere 上听说过这个,你确定旧的 CWA 也没有发生这种情况吗?
如果问题仍然存在,我建议联系 SDL 客户支持。
在cd_cwa_conf.xml文件中,还可以添加如下参数:
<configuration>
...
<!-- Number of seconds to wait for the default Servlet to pick up changes on the file-system -->
<file-synchronization delay="..." />
...
</configuration>
正如克里斯所说,第一次请求二进制文件时,文件被序列化并缓存在磁盘上。如果该过程太长,则应用服务器将返回 404。
使用此参数,系统会在访问文件之前等待几秒钟(即指定的值)。
我们在 Tomcat 服务器上遇到了同样的问题,这已经修复了 pb。
我认为这个问题到底是关于什么的有点混乱。所以尼克解释说,对二进制文件的第一个请求会导致 404。任何后续请求都会按预期提供二进制文件。因此,Elena 给出的答案并不能真正解决这个问题,尽管她非常正确地说必须在 WebSphere 中进行该特定设置。
“仅在第一个请求上获得 404”问题的答案是在每个 URL 模式二进制类型到默认 Servlet 的 web.xml 文件中都有一个显式映射。这在http://sdllivecontent.sdl.com/LiveContent/content/en-US/SDL_CWA_10/task_C1FECE85AD5E4F0BB3957C4516D7E2AC中进行了描述,项目符号 #6:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
文档说明这修复了 JBoss、Tomcat,但我也看到它修复了 WebLogic。我希望它也能修复 WebSphere。请告诉我们。
对于 WebSphere 7,默认 servlet 称为 FileServlet,因此以下应该可以工作:
<servlet>
<servlet-name>FileServlet</servlet-name>
<servlet-class>
com.ibm.ws.webcontainer.servlet.SimpleFileServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileServlet</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FileServlet</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FileServlet</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FileServlet</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
如果您使用的是 Tomcat 7(可能是 Tomcat 6 的最新版本),请小心。web.xml 文件的合并方式存在限制。
我不知道确切的原因,但是您不能定义到默认 servlet 的多个映射。此 servlet 只能有一个映射条目。
也许与此有关:https ://issues.apache.org/bugzilla/show_bug.cgi?id=50026
顺便说一句,您可以通过重新定义默认映射来绕过此限制。
例如:以下内容不适用于 Tomcat 7.0.33。所有资源都出现 404 错误。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/worldwide/binaries/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/france/binaries/*</url-pattern>
</servlet-mapping>
以下工作完美
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/worldwide/binaries/*</url-pattern>
<url-pattern>/france/binaries/*</url-pattern>
<url-pattern>/</url-pattern>
</servlet-mapping>
希望它有所帮助。