7

一个简单的 HTML 代码:

<img src="http://someaddr/image.php">

image.php 是一个脚本,它返回一个随机重定向到具有所有必要的无缓存标头的静态图像:

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Location: http://someaddr/random_image_12345.jpg

问题:来回导航到此 HTML 页面时,Chrome(最新的 win/mac)不会重新验证 address http://someaddr/image.php

我尝试过使用重定向 302 和 303(在 RFC 中有更强的要求,它不应该被浏览器缓存)。这就像 IE、FireFox、Opera 中的魅力一样。他们总是刷新http://someaddr/image.php。但 Chrome 没有。

我什至在 Chrome 中使用过开发人员工具,似乎在网络日志中它甚至没有显示任何尝试(缓存或不缓存) fetching http://someaddr/image.php。网络日志仅显示一个已连接到http://someaddr/random_image_12345.jpg(缓存)的连接。怎么这么破……

我知道将查询字符串放入图像源的天真/简单的解决方案:

    <img src="http://someaddr/image.php?refresh={any random number or timestamp}">

但我不喜欢/不能使用这样的黑客。还有其他选择吗?

4

2 回答 2

5

尝试 307 重定向

但是,如果您因为缓存重定向而无法访问无法使用的链接...

这不会清除缓存,但如果您正在拉头发试图访问已重定向缓存的链接,它是一种快速且可能的绕过它的路线。

将链接地址复制到地址栏中,并在地址中添加一些 GET 信息。

示例 如果您的网站是http://example.com

Put a ?x=y at the end of it 
( example.com?x=y ) - the x and y could be anything you want.

如果已经有 ? 在 url 后面有一些信息

( example.com?this=that&true=t ) - try to add &x=y to the end of it...

( example.com?this=that&true=t&x=y )
于 2013-09-25T23:58:41.613 回答
-3

从 另一个问题中发布的链接:

 The first header Cache-Control: must-revalidate means that browser must send validation request every time even if there is already cache entry exists for this object.
Browser receives the content and stores it in the cache along with the last modified value.
Next time browser will send additional header:
If-Modified-Since: 15 Sep 2008 17:43:00 GMT

This header means that browser has cache entry that was last changed 17:43.
Then server will compare the time with last modified time of actual content and if it was changed server will send the whole updated object along with new Last-Modified value.

If there were no changes since the previous request then there will be short empty-body answer:
HTTP/1.x 304 Not Modified

您可以使用 HTTP 的 etags 和最后修改日期来确保您不会发送它已经缓存的浏览器数据。

$last_modified_time = filemtime($file); 
$etag = md5_file($file); 

header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
header("Etag: $etag"); 

if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time || 
    trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) { 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
} 
于 2012-11-25T18:03:56.200 回答