浏览器缓存HTTP 301s的时间有多长?

浏览器缓存HTTP 301s的时间有多长?,http,http-status-code-301,Http,Http Status Code 301,我正在调试HTTP 301永久重定向的问题。经过快速测试后,Safari似乎在重启时清除了其301s缓存,但Firefox没有 IE、Chrome、Firefox和Safari何时清除其301s缓存 更新:例如,如果我想将example1.com重定向到example2.com,但我不小心将其设置为重定向到example3.com,这是一个问题。我可以纠正错误,但是在此期间访问过example1.com的任何人都将缓存错误的重定向到example3.com,因此在清除缓存之前,他们将无法访问ex

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

IE、Chrome、Firefox和Safari何时清除其301s缓存

更新:例如,如果我想将
example1.com
重定向到
example2.com
,但我不小心将其设置为重定向到
example3.com
,这是一个问题。我可以纠正错误,但是在此期间访问过
example1.com
的任何人都将缓存错误的重定向到
example3.com
,因此在清除缓存之前,他们将无法访问
example1.com
example2.com
。经调查,我发现没有设置
缓存控制
过期
头。不正确301响应的标题如下所示:

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://example3.com/
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缓存,但在浏览器重新启动时不清除,那么它们什么时候才能清除?

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

如果要控制缓存持续时间,可以使用HTTP响应头
缓存控制
过期
执行相同的操作。或者,如果您根本不想缓存
301
响应,请使用以下标题

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

如果没有另外指定的缓存控制指令,301重定向默认为缓存,没有任何到期日期。

也就是说,只要浏览器的缓存能够容纳它,它就会保持缓存状态。如果手动清除缓存,或者清除缓存条目以腾出空间容纳新条目,则会将其从缓存中删除

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

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

如果不希望缓存重定向

这种不确定的缓存只是这些浏览器在没有其他指定的头的情况下的默认缓存。逻辑是,您正在指定一个“永久”重定向,而不给他们任何其他缓存指令,因此他们会将其视为您希望无限期缓存它

浏览器仍然遵守缓存控制,并与任何其他响应一样(如果指定)终止标头

您可以向301重定向添加头,例如
缓存控制:max age=3600
Expires:Thu,2014年12月1日16:00:00 GMT
。您甚至可以添加
缓存控制:无缓存
,这样它就不会被浏览器永久缓存;或者
缓存控制:无存储
,这样它就不能被浏览器存储在临时存储中

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

如果您之前发出了301重定向,但希望取消该重定向

如果用户的浏览器中仍有缓存的301重定向,则无论源页面是否仍有重定向,他们都将继续被带到目标页面。修复此问题的选项包括:

  • 一个简单的解决方案是再次发出另一个重定向

    如果浏览器在重定向过程中第二次被定向回同一URL,它应该再次从源站获取该URL,而不是再次从缓存重定向,以避免重定向循环。对此答案的评论表明,现在所有主流浏览器都可以使用此功能,但也可能有一些小型浏览器无法使用此功能

  • 如果您无法控制上一个重定向目标所在的站点,那么您就不走运了。试着请求站点所有者重定向回您


预防胜于治疗-如果您不确定是否要永久取消旧URL的委托,请避免301重定向。

这是一个帮助那些迫切希望摆脱重定向缓存的人的答案:

Chrome无限缓存301重定向(在本地磁盘缓存中)。要清除此缓存,请执行以下操作:

  • 打开您的DevTools(按
    F12
  • 在“网络”选项卡上选中“禁用缓存”复选框
  • 保持DevTools打开并重新加载页面(按
    F5

当一切正常时,您可以取消选中“禁用缓存”,一切都将按预期继续工作。

我有一个简单的解决方案,可用于所有主要浏览器(最新版本),包括IE、Chrome和FF

  • Ctrl+Shift+Del
  • -
  • Chrome:选择“浏览历史记录”和“缓存…”
  • IE:我保留默认选项“临时互联网文件和网站文件”、“Cookies和网站数据”、“历史记录”
  • FF:“浏览和下载历史记录”,“缓存”
  • 单击“删除”
  • 关闭并重新打开浏览器。应该行得通
  • 睾丸素
    <body onload="document.forms[0].submit()">
    <form action="https://forum.pirati.cz/unreadposts.html" method="post">
        <input type="submit" value="fix" />
    </form>
    </body>
    
    <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>
    
    RewriteRule /my-source /my-target [L,R=301]
    
    # RewriteRule /my-source /my-target [L,R=301]
    RewriteRule /my-target /my-source [L,R=301]
    
    chrome://settings/clearBrowserData
    
      <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>