我正在调试一个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缓存,但不清楚浏览器重启,所以他们什么时候会清除?


当前回答

移动Chrome(93版)的一个技巧:尝试在“桌面网站”模式下打开url -这在我的情况下删除了一个永久缓存重定向。

其他回答

在没有指定其他缓存控制指令的情况下,301重定向默认为不带任何过期日期的缓存。

也就是说,只要浏览器的缓存可以容纳它,它就会一直被缓存。如果您手动清除缓存,或者为了给新缓存腾出空间而清除缓存条目,则会将其从缓存中删除。

您至少可以在Firefox中通过about:cache并在磁盘缓存下找到它来验证这一点。它在包括Chrome和基于Chromium的Edge在内的其他浏览器中也是这样工作的,尽管它们没有about:cache来检查缓存。

在所有浏览器中,仍然可以使用缓存指令覆盖这个默认行为,如下所述:

如果你不希望重定向被缓存

这种不确定缓存只是这些浏览器在没有指定的头文件时的默认缓存。逻辑是你指定了一个“永久的”重定向,而不给他们任何其他缓存指令,所以他们会把它当作你想要无限缓存。

如果指定了Cache-Control和Expires头,浏览器仍然像其他响应一样尊重它们。

您可以添加诸如Cache-Control: max-age=3600或Expires: Thu, 01 Dec 2014 16:00:00 GMT到您的301重定向头。你甚至可以添加Cache-Control: no-cache,这样它就不会被浏览器永久缓存,或者Cache-Control: no-store,这样它甚至不能被浏览器存储在临时存储中。

但是,如果您不希望您的重定向是永久的,那么使用302或307重定向可能是更好的选择。发出一个301重定向,但将其标记为不可缓存违背了301重定向的精神,即使它在技术上是有效的。YMMV,您可能会发现一些边缘情况,其中“永久”重定向具有时间限制是有意义的。注意,302和307重定向在浏览器默认情况下不缓存。

如果您之前发出了301重定向,但想要取消该操作

如果人们在浏览器中仍然有缓存的301重定向,他们将继续被带到目标页面,而不管源页面是否仍然有重定向。解决这个问题的方法包括:

A simple solution is to issue another redirect back again. If the browser is directed back to a same URL a second time during a redirect, it should fetch it from the origin again instead of redirecting again from cache, in an attempt to avoid a redirect loop. Comments on this answer indicate this now works in all major browsers - but there may be some minor browsers where it doesn't. If you don't have control over the site where the previous redirect target went to, then you are out of luck. Try and beg the site owner to redirect back to you.

预防胜于治疗-避免301重定向,如果你不确定你想要永久撤销旧的URL。

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_expires.c>
  ExpiresActive On
  Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
  Header Set Cache-Control "max-age=0, no-store"
  Header Set Cache-Control "no-store"
  Header set Pragma "no-cache"
  </IfModule>

使用隐身/InPrivate模式测试重定向,这样当你关闭浏览器时,它会刷新缓存,重新打开窗口时将不包含缓存。

Chrome 71

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

Chrome 48 - 70

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

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