标题Cache-Control: max-age=0意味着内容被认为是陈旧的(并且必须立即重新获取),这实际上与之相同Cache-Control: no-cache.
我正在寻找一个试图使用If-Modified-Since请求对象的标头的缓存库.问题是这个标题永远不会被设置,它总是空白的,这对我来说是有意义的,看它是如何请求的.
你怎么能强制要求有一个If-Modified-Since标题?或者我是否会这样做.
这是我指的功能.
public function isNotModified(Request $request)
{
$lastModified = $request->headers->get('If-Modified-Since');
$notModified = false;
if ($etags = $request->getEtags()) {
$notModified = (in_array($this->getEtag(), $etags) || in_array('*', $etags)) && (!$lastModified || $this->headers->get('Last-Modified') == $lastModified);
} elseif ($lastModified) {
$notModified = $lastModified == $this->headers->get('Last-Modified');
}
if ($notModified) {
$this->setNotModified();
}
return $notModified;
}
Run Code Online (Sandbox Code Playgroud) Etag提供的缓存验证适用于FF和chrome,但IE似乎忽略了Etag值并始终返回缓存的响应.
服务器响应是:
HTTP/1.1 200 OK
Date: Mon, 07 Jul 2014 06:01:57 GMT
Content-Type: application/json
ETag: a7628382056ddd13b7e06991571fd3ad
Content-Encoding: gzip
Content-Length: 4360
Run Code Online (Sandbox Code Playgroud)
当客户端发送条件获取请求时
If-None-Match: 71fb49ecd6f85545693dec0e78ae2131
Run Code Online (Sandbox Code Playgroud)
根本不发送请求,IE返回缓存的响应.当ETag值相同时它是透明的但是当ETag不同时它是一个问题.
对我有用的唯一解决方案是添加标题
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)
我监控网络并强制IE验证ETag值.
问题解决了!
但是我没有找到任何正式的解决方案.我使用帖子Make IE来缓存资源,但总是重新验证作为参考,但大多数信息与我的问题无关.
如果您有其他想法或建议,请分享
基本上,我试图通过启用缓存使我的网站更加用户友好.为了测试我的进度,我使用Chrome和IE中的开发人员工具,其最终目标是最大限度地减少对Web服务器的调用次数.当chrome缓存某些东西时,开发的工具会给出200(缓存)的请求响应.另一方面,IE将始终向服务器发送一个小请求,并在从缓存中读取之前获得304响应.
哪个浏览器正在关注HTTP,如果答案是Chrome,我怎样才能消除IE中不必要的304调用?
我正在 Tomcat 的 web.xml 中设置过期过滤器。标头正确响应,但 IE 仍未缓存。它总是向 Tomcat 发出新的请求。
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
<init-param>
<param-name>ExpiresByType image/png</param-name>
<param-value>access plus 2 hours</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
以下是响应的标题
缓存控制:max-age=7199
到期时间:2016 年 11 月 14 日星期一 16:08:22 GMT
内容类型:图像/png
传输编码:分块
日期:2016 年 11 月 14 日星期一 14:08:22 GMT
有谁知道,我在这里错过了什么?
我最近发现,我们Cache-Control:no-cache在所有WebApi响应中都使用了它。我知道在浏览器缓存发生变化之前,您永远都不知道浏览器是否可以缓存json,因此这很重要。
据我所记得,目前还没有现代浏览器在缓存ajax响应,因此不需要此标头。但是我真的很想再次检查一下,并在这里询问一下行为,因为找不到有关该主题的最新文章。
所以问题实际上是:我们是否仍需要设置Cache-Control:no-cacheSPA应用程序的Web api调用,如果是,那么哪些浏览器进行缓存?
ajax cache-control browser-cache asp.net-web-api single-page-application