我们有一个在生产环境中部署的网站,与xyz网站管理员合作。以下是当错误在两个不同实例中发生时的Web控制台的两个截图。
我们面临着这个问题,它是间歇性的,不是一直存在。此外,这只发生在少数用户身上,而不是所有用户(我不知道这是否与地区有关)。当出现这个问题时,页面无法正确加载。经过几次刷新尝试后,页面会正确加载,其他所有功能都按预期工作。
众所周知,网站管理员启用了严格的MIME类型检查。
所有资源(.js和.css文件)的URL路径都是准确的。 这些文件在源头设置的MIME类型是正确的。以下是.jsp页面的代码片段,其中引用了这些文件。
根据我的理解,请求流程如下所示的小图表。 我怀疑问题是由网站管理员服务器在将响应发送回客户端浏览器时引起的(步骤4)。在他们从应用程序服务器读取响应后,我怀疑他们的服务器未能维护文件的相同Content-Type(.css / .js)。在我确认我的理解之前,我想证明这一点,但由于这只发生在生产中,因此我缺乏工具来证明这一点。我们在开发环境中看不到此问题以进行调试!!!
根据网站管理员的说法,问题在应用程序代码中。我们代码中每个.jsp文件中的每个.js / .css文件的类型。我看到的是浏览器不接受来自网站管理员的响应。因为我们维护CSS文件的rel =“stylesheet”type =“text / css”和所有JavaScript文件的type =“text / javascript”,所以我在应用程序服务器中没有看到这个问题!!
提前感谢您的建议。
尽管如此,我们经常在浏览器中遇到MIME类型不匹配的情况。网站管理员团队声称应用服务器必须发送错误的内容,没有任何合理的信息。
编辑2: 然后我使用以下命令测试资源(js / css文件)发送的头文件。 curl -I https://myapplication/static/js/angular/angular.min.js 以下是我收到的响应。当我运行100次循环时,它始终返回相同的响应。
为确保资源从服务器加载而非缓存,请查看开发工具中的网络选项卡。如果资源显示200状态码,则已成功从服务器加载。如果状态码为304,则已从缓存加载。
- 编辑4: 我不知道网站管理员如何建立SSL连接。当SSL连接未正确建立时,会将内容以text/html形式呈现。目前,我不知道是否存在这种情况。我正在寻找解决问题的所有可能领域!
众所周知,网站管理员启用了严格的MIME类型检查。
所有资源(.js和.css文件)的URL路径都是准确的。 这些文件在源头设置的MIME类型是正确的。以下是.jsp页面的代码片段,其中引用了这些文件。
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/css/bootstrap/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/static/css/jquery/jquery-ui.css" type="text/css" />
<script src="${pageContext.request.contextPath}/static/js/jquery/jquery.min.js" type="text/javascript" ></script>
<script src="${pageContext.request.contextPath}/static/js/bootstrap/bootstrap.min.js" type="text/javascript"></script>
<script src="${pageContext.request.contextPath}/static/js/jquery/jquery.slimscroll.min.js" type="text/javascript"></script>
<script src="${pageContext.request.contextPath}/static/js/jquery/jquery.dataTables.min.js" type="text/javascript"> </script>
根据我的理解,请求流程如下所示的小图表。 我怀疑问题是由网站管理员服务器在将响应发送回客户端浏览器时引起的(步骤4)。在他们从应用程序服务器读取响应后,我怀疑他们的服务器未能维护文件的相同Content-Type(.css / .js)。在我确认我的理解之前,我想证明这一点,但由于这只发生在生产中,因此我缺乏工具来证明这一点。我们在开发环境中看不到此问题以进行调试!!!
根据网站管理员的说法,问题在应用程序代码中。我们代码中每个.jsp文件中的每个.js / .css文件的类型。我看到的是浏览器不接受来自网站管理员的响应。因为我们维护CSS文件的rel =“stylesheet”type =“text / css”和所有JavaScript文件的type =“text / javascript”,所以我在应用程序服务器中没有看到这个问题!!
提前感谢您的建议。
Edit 1: Added mimetypes in web.xml, as below:
<mime-mapping> <extension>js</extension> <mime-type>application/javascript</mime-type> </mime-mapping> <mime-mapping> <extension>css</extension> <mime-type>text/css</mime-type> </mime-mapping>
<mimeTypes>
<type>js=application/javascript</type>
<type>css=text/css</type>
</mimeTypes>
尽管如此,我们经常在浏览器中遇到MIME类型不匹配的情况。网站管理员团队声称应用服务器必须发送错误的内容,没有任何合理的信息。
编辑2: 然后我使用以下命令测试资源(js / css文件)发送的头文件。 curl -I https://myapplication/static/js/angular/angular.min.js 以下是我收到的响应。当我运行100次循环时,它始终返回相同的响应。
HTTP/1.1 200 OK X-Backside-Transport: OK OK Content-Language: en-US Content-Length: 168517 **Content-Type: application/javascript** Date: Tue, 19 Jun 2018 10:38:25 GMT Last-Modified: Tue, 29 May 2018 17:04:10 GMT X-Powered-By: Servlet/3.1 X-Global-Transaction-ID: 1178221711 Connection: close
所以,在应用服务器方面我没有看到任何问题。
- 编辑3:当网站管理员建议过期的缓存可能会导致此类问题时,他们已从其端禁用了缓存。我还编写了服务器端代码以确保缓存已禁用。以下是参考的代码片段:
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.
为确保资源从服务器加载而非缓存,请查看开发工具中的网络选项卡。如果资源显示200状态码,则已成功从服务器加载。如果状态码为304,则已从缓存加载。
- 编辑4: 我不知道网站管理员如何建立SSL连接。当SSL连接未正确建立时,会将内容以text/html形式呈现。目前,我不知道是否存在这种情况。我正在寻找解决问题的所有可能领域!