我在 appengine-web.xml 中使用以下内容在 appengine 中启用了静态图像文件的缓存:
<static-files>
<include path="/css/images/**.gif" expiration="1d" />
<include path="/css/images/**.png" expiration="1d" />
<include path="/css/images/wind_pointers/*.png" expiration="7d" />
<include path="/css/images/**.jpg" expiration="1d" />
<include path="/errors/*" />
</static-files>
这种方法非常有效,直到我发现了一个奇怪的副作用:有时,appengine 会提供一个包含 HTML 页面内容的 JavaScript 文件,因此结果是我收到大量 JavaScript 错误,因为 JavaScript 解释器输入的是 HTML 而不是 JS:
现在,如果我只是注释掉我上面提到的 appengine-web.xml 中的 static-files 部分,一切都会正常工作:.js 文件提供了自己的内容,我没有任何问题:
这对我来说似乎很奇怪。 .js 文件甚至不在该 static-files 部分中指定的目录中。我的 appengine-web.xml 中的语法是否错误,导致出现一些奇怪的错误?
幸运的是,只需注释掉 appengine-web.xml 中的 static-files 部分,我就能够在已部署的应用程序和本地开发服务器上轻松可靠地重现这一点。 Chrome 和 IE 中都会发生这种情况。我正在使用 Java 应用程序引擎。
最佳答案
我已经设法弄清楚发生了什么:
我的 web.xml 中有一个过滤器,其编码目的是,如果用户请求页面但未登录,则将返回一个特殊的 HTML 页面。但是,我发现该过滤器也将自身应用于浏览器对 .js 文件发出的请求,因此我的过滤器将返回 HTML 文件而不是 .js 文件。
奇怪的是,当从 appengine-web.xml 中删除 部分时,我没有遇到问题。如果没有该部分,AppEngine 将恢复为默认行为,根据文档,该行为会将所有文件视为静态,在这种情况下,我预计问题总是会发生。另外,有时会返回 .js,有时会返回 HTML - 这似乎是某个地方的竞争条件。这对我来说仍然是个谜。
无论如何,我现在确保过滤器仅应用于对网站 HTML 页面的请求,这解决了问题。感谢您的所有评论。
关于在 appengine-web.xml 中使用静态文件声明时,Javascript 文件将作为 HTML 文件提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14647068/