我正在调试一个HTTP 301永久重定向的问题。经过快速测试,Safari似乎在重新启动时清除了它的301缓存,但Firefox却没有。

IE、Chrome、Firefox和Safari什么时候清空它们的301缓存?

For example, if I want to redirect 1.example to 2.example, but I accidentally set it to redirect to 3.example, that is a problem. I can correct the mistake, but anyone who has visited 1.example in the meantime will have cached the incorrect redirect to 3.example, and so they will not be able to reach either 1.example or 2.example until their cache is cleared. Upon investigation, I find that there were no Cache-Control and Expires headers set. The headers for the incorrect 301 response would have been like this:

HTTP/1.1 301 Moved Permanently
Date: Wed, 27 Feb 2013 12:05:53 GMT
Server: Apache/2.2.21 (Unix) DAV/2 PHP/5.3.8
X-Powered-By: PHP/5.3.8
Location: http://3.example/
Content-Type: text/html

我自己的测试表明:

IE7, IE8, Android 2.3.4完全不缓存。 Firefox 18.0.2、Safari 5.1.7(适用于Windows 7)和Opera 12.14都有缓存,并在重新启动浏览器时清除缓存。 IE10和Chrome 25缓存,但不清楚浏览器重启,所以他们什么时候会清除?


当前回答

让用户在该url上提交一个post表单,缓存的重定向消失了:)

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>

其他回答

301是每个HTTP RFC的可缓存响应,浏览器将根据响应上的HTTP缓存头缓存它。使用FireBug或Charles检查响应头,以了解响应将被缓存的确切时间。

如果你想控制缓存持续时间,你可以使用HTTP响应头Cache-Control和Expires来做同样的事情。或者,如果根本不想缓存301响应,可以使用下面的头文件。

Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT

正如其他答案所示,在浏览器中缓存的持续时间可能是无限的。这是极其危险和恼人的。所以不要这么做。至少添加缓存头。在htaccess中,我总是这样做,根本没有缓存:

<IfModule mod_rewrite.c>
  RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
  # The E=nocache:1 sets the environment variable nocache to the value of one
  RewriteRule ^/?(.*) https://www.example.org/$1 [L,R=301,E=nocache:1]
</IfModule>


<IfModule mod_headers.c>
  ## Set the response header if the "nocache" environment variable is set
  ## in the RewriteRule above.
  Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache

  ## Set Expires too ...
  Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</IfModule>

编辑:

如果过去没有缓存301重定向,则必须从目标重定向回源。例子:

如果你有这个

RewriteRule /my-source /my-target [L,R=301]

你需要把这个

# RewriteRule /my-source /my-target [L,R=301]
RewriteRule /my-target /my-source [L,R=301]

要禁用重定向,请将此代码放在重定向站点的索引文件中

<script>
    fetch('https://www.example.com', {method: 'post'}).then(() => {})
</script>

为了测试目的(避免缓存重定向),人们可以打开NEW PRIVATE WINDOW:点击CTRL+SHIFT+N[如果你使用Mozilla,使用P]

Chrome 71

要清除永久重定向,转到chrome://settings/clearBrowserData,从那里只清除“缓存的图像和文件”清除重定向。

Chrome 48 - 70

转到chrome://net-internals。在顶部红色状态栏右侧,点击向下箭头▼打开下拉菜单,在“工具”组下,选择“清空缓存”。

在48版中,这是唯一对我有效的清除缓存301的方法。