【问题标题】:Coldfusion CGI.HTTP_IF_MODIFIED_SINCE seems not to work in IEColdfusion CGI.HTTP_IF_MODIFIED_SINCE 似乎在 IE 中不起作用
【发布时间】:2013-06-03 17:25:24
【问题描述】:

为了防止浏览器每次都加载文件,我使用了 HTTP_IF_MODIFIED_SINCE 标头。我检查标题是否未填写或过期日期之后。如果不是这样,我会返回 304 状态码:

<cfset modSince = "#cgi.HTTP_IF_MODIFIED_SINCE#">
<cfif modSince EQ "" || modSince NEQ "" AND ParseDateTime(modSince).after(datum)>
    <cfheader name="Last-Modified" value="#SimpleDateFormat.format(datum)#">
    <cfheader name="Expires" value="#SimpleDateFormat.format(expirevalue)#">
    <cfcontent reset="true" type="#mimetype#" file="#bestand#">
<cfelse>
    <cfheader statuscode="304" statustext="Not Modified" />
</cfif>

它在 Chrome 和 Firefox 中完美运行(文件由缓存加载,因为开发人员工具指出文件返回 304 状态代码)。 IE(8、9、10 测试)不是这样,因为该状态码始终为 200。我是否需要一些特殊的标头来强制 IE 发送它的 if-modified-since 标头?

【问题讨论】:

    标签: tomcat caching coldfusion railo


    【解决方案1】:

    我不确定您为什么要尝试自己管理此功能。让浏览器完成它们设计的工作。如果您将 Expires 标头设置为将来的某个时间点,浏览器应该“自动”执行您正在尝试执行的操作;使用本地缓存的版本。一旦Expires 时间过去,浏览器应该请求一个新的副本。

    您还需要设置Cache-Control 标头。这个页面很好地描述了这个过程:Increasing Application Performance with HTTP Cache Headers注意:如果 Expires 和 max-age 都设置了 max-age 将优先。

    【讨论】:

    • 我想要这样做的原因:我从服务器收到的文件可以由用户更改(它是一个图像),所以你不能只是将“过期”设置为某个随机日期。因此我不想缓存客户端(即浏览器总是需要向服务器询问新文件)。但是可以做些什么来防止在未更改时下载相同的文件,检查服务器端。当文件没有改变时,只返回一个 304 状态。在 IE 中出现问题: if-modified-since 标头为空 --> 因此文件再次下载。顺便说一句,我确实添加了缓存控制:无缓存,但也没有区别。
    • 好的,我明白了。这在我referenced under Conditional requests的文章中也有描述。这仍应由浏览器和 Web 服务器控制。您不需要在代码中执行此操作。您使用的是什么平台(Web 服务器、操作系统、Java EE 服务器)?
    • 我正在使用 tomcat 和 Railo (coldfusion)。 “您不应该在您的代码中执行此操作”-> 在您引用的文章中,他们也在他们的 code 中执行此操作。检查 rails 和 java 的示例。
    • 您在代码中设置了标头,但您不需要检查并发回 304 响应。适当设置标题后,应为您处理该部分。
    • 也许 tomcat 的工作方式与 IIS 不同。我的陈述是指 IIS,默认情况下它会缓存图像。我可以检查我的日志文件,并查看对图像、css、js、文件的请求正在获得 304 响应,而无需我做任何事情来使其正常工作。如果文件更改,那么他们将获得新文件。我假设tomcat也应该以这种方式工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2015-05-20
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多