浏览器将HTTP 301缓存多长时间?


380

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

IE,Chrome,Firefox和Safari何时清除其301缓存?

更新:例如,如果我想重定向example1.comexample2.com,但不小心将其设置为重定向到example3.com,那就是一个问题。我可以纠正该错误,但是example1.com与此同时访问过的任何人都将不正确的重定向缓存到example3.com,因此他们将无法访问其中一个,example1.com或者example2.com直到清除了缓存为止。经调查,我发现没有Cache-ControlExpires标头设置。不正确的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缓存,但是在浏览器重启时不会清除那么什么时候清除?

7
请告诉Chrome,我们需要摆脱301地狱漏洞的出路
英国电信

@BT,因为该问题影响所有浏览器,所以实际上只有IETF可以解决此问题,可能是通过对没有TTL的缓存301定义一些强制性超时,以便浏览器最终重新验证其缓存假设。
McGuireV17年

1
如果有人仍然关注这个问题,我就在IETF邮件列表上开始了讨论,如果您觉得自己很权重:lists.w3.org/Archives/Public/ietf-http-wg/2017OctDec/0363.html
McGuireV10'1

Answers:


299

至少有两个浏览器(Chrome和Firefox)将缓存301重定向,且没有到期日期

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

您可以至少在Firefox中进行验证,方法about:cache是在磁盘缓存下找到它。

我不了解其他浏览器的行为,例如IE10 / IE11。但是,鉴于其他浏览器会无限期地对其进行缓存,因此无论如何您都必须适应这种情况。

在所有浏览器(包括Chrome / Firefox)中,仍然可以使用标头覆盖此默认行为,如下所述:

注意:此答案写于2014年,浏览器行为可能会随着时间而改变。

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

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

如果已指定,浏览器仍然会像对待其他任何响应一样使用Cache-Control和Expires标头。

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

我认为,更好的替代方法是使用302或307重定向。这些并不向浏览器或缓存暗示它们是“永久”重定向,因此不应在缺少Cache-Control标头的情况下进行缓存。

对我来说,这似乎是发出301重定向,但将其标记为不可缓存将会对精神的301重定向是什么,即使它可能是技术上有效。YMMV,您可能会发现在某些极端情况下,“永久”重定向具有时间限制是有意义的。

如果您之前发布了301重定向,但想撤消该重定向

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

  • 最简单,最好的解决方案是再次发出另一个301重定向。

    浏览器将意识到它已被定向回到先前认为已失效的URL,这将导致它再次重新获取该URL,以确认旧的重定向仍不存在。

    编辑:一些评论对此表示怀疑,请参见下文。

  • 如果您无法控制以前的重定向目标所到达的站点,那么您就太不走运了。尝试恳求网站所有者重定向回您。

另外,预防胜于治疗-如果不确定要永久停用旧网址,请避免使用301重定向。


18
另外,您是否有参考资料表明浏览器通过重新获取原始URL来处理循环永久重定向?
凯文·克里斯托弗·亨利

7
301重定向不起作用,浏览器仍然缓存旧的301重定向,我看到了无限循环
Yuriy Kolodovskyy 2014年

5
我该怎么做了试验:前一段时间我没有做301重定向的http://www.SOMEHOST.comhttps://www.SOMEHOST.com。但是现在http://www.SOMEHOST.com必须是站点的主要主机。因此,从https重定向到http删除。正如你展示我的确让重定向301 https://www.SOMEHOST.comhttp://www.SOMEHOST.com,但见循环。浏览器未重新获取...
Yuriy Kolodovskyy 2014年

8
我确认只要您(显然)删除了最初的301重定向,重定向(在我的情况下为PHP重定向)就可以在Google Chrome上正常运行。
Vincent Poirier

15
我可以确认重定向返回工作正常。浏览器看到重定向循环使缓存条目无效。测试了IE11,火狐52,Safari浏览器10,浏览器57,
Munhitsu

258

从Chrome 71

要清除永久重定向,请转到chrome:// settings / clearBrowserData,然后仅清除“缓存的图像和文件”即可清除重定向。

铬48-70

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

从版本48开始,这是唯一清除缓存301的方法。


14
不幸的是,从Chrome版本54开始,此功能不适用于我。
pwagner '16

4
第二个想法是,我并没有真正回答“浏览器将301缓存多长时间” 这个真正的问题,我的回答也不会帮助任何重定向了面向公众的网站的人,在该网站上您可能需要一些方法来永久撤消301。却不知道有多少浏览器缓存了重定向-其他答案部分解决了这种情况。我的回答实际上仅对您可以与所有受影响的用户进行通信的开发人员或Intranet场景有用。
McGuireV17年

1
在Chrome版本68.0.3440.106(正式版本)中工作
Thum Choon Tat

12
chrome:// net-internals已在Chrome 71中删除。下拉/工具部分消失了。有一个DNS>主机解析器缓存>清除主机缓存按钮,但这对删除缓存的301无效。
t-jam

52
在Chrome 71中,chrome:// settings / clearBrowserData并从此处仅清除“缓存的图像和文件”会清除重定向。
Bemmu

179

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

Chrome浏览器将301重定向无限缓存(在本地磁盘缓存中)。要清除此缓存:

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

一切正常后,您可以取消选中“禁用缓存”,一切将继续按预期进行。


14
即使重新启用缓存后,重定向仍然有效。谢谢!
migg

2
看起来这不适用于通过本地主机文件指向127.0.0.1的域。在这种情况下还有其他选择吗?
pwagner '16

如果重定向意外地指向另一个端口,如from localhost:8000localhost(端口80),则该功能将无效。我还从localhost和localhost:8000清除了整个站点/应用程序数据,但这都没有帮助。
Dennis98 '17

3
该解决方案自2019年11月16日起在Chrome版本78.0.3904.97上运行。其他解决方案不再可用。当它开始工作后,您可以关闭开发人员工具,它将继续正常工作。
彼得·伍斯特

接受的答案。
Aysennoussi

43

让用户在该URL上提交帖子表单,并且缓存的重定向不存在了:)

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

2
我同意这是我发现拧开它的最佳方法。
esjay

与其他答案不同,此方法适合解决其他人的问题而无需打开开发人员控制台!谢谢
Alexey Rytikov

4
fetch('URL',{method:'POST'})应该以相同的方式完成操作。谢谢!这省了我一些头疼!
卡尔文

我无法相信这是对我有用的唯一方法(我首先尝试了所有其他方法-甚至由于跨站点安全策略,控制台fetch()都失败了)。
user36388

24

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

如果要控制缓存持续时间,可以使用HTTP响应标头Cache-ControlExpires执行相同的操作。另外,如果您根本不想缓存301响应,请使用以下标头。

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

12
尽管从技术上讲是正确的,但是您的答案无法回答用户的问题,因此也无法回答我在这里提出的问题。对于主浏览器,已存在于浏览器中的现有未缓存标头301何时过期?

如果有人仍然有兴趣,这个链接指令可以切换缓存301
旧金山Presencia

该链接适用于FF,但对我而言无效。安装的Web开发扩展1.2.5使用FF 23.0.1
安富

问题没有得到回答。问题是,如果未指定到期日期,重定向将被缓存多长时间
丹尼斯·弗拉格

21

有一种非常简单的方法可以删除HTTP重定向的浏览器缓存,例如301、307等。

您可以在Chrome开发者控制台中打开网络面板。选择网络呼叫。右键单击它,然后单击“ 清除浏览器缓存”以删除缓存的重定向。

网络通话上下文菜单


1
非常感谢你!简单的解决方案和工作!这种方式将来也应该起作用。
sgon00

16

已确认!!让用户向受影响的网址提交发布请求,并且忘记了缓存的重定向。

一个快速的胜利就是如果您可以在浏览器控制台中输入以下内容:

fetch('example.com/affected/link', {method: 'post'}).then(() => {})

如果您知道受影响的浏览器(特别是在开发过程中),则很有用。

另外,如果您有权访问上一个301重定向页面,则可以将此脚本添加到该页面中,并且无论何时访问该脚本,都将忘记缓存的301。


这与上面的帖子形式相似,只是省力。
jpswade

没错,@ jpswade
Emeke Ajeh,

12

我将发布对我有帮助的答案:

转到网址:

chrome://settings/clearBrowserData

它应该调用弹出窗口,然后..

  • 仅选择: cached images and files
  • 选择时间框: from beginning

使用Chrome 79!
webaholik

使用Chrome 80,谢谢!
约瑟夫

6

作为@thomasrutter的答案

如果您之前发布了301重定向,但想撤消该重定向

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

最简单,最好的解决方案是再次发出另一个301重定向。

浏览器将意识到它已被定向回到先前认为已退役的URL,这将导致它再次重新获取该URL,以确认旧的重定向仍不存在。

如果您无法控制以前的重定向目标所到达的站点,那么您就太不走运了。尝试恳求网站所有者重定向回您。

实际上,这意味着:

  1. 301至b.com

  2. 删除a.com的301

  3. 将b.com 301添加到a.com

然后就可以了。


2
但是随后您仍然有b.com 301徘徊:(-肮脏的补丁
BT

1
您可以通过从其他页面发出另一个301来清除重定向吗?例如(a.com301-> b.com)(删除a.com301)(添加a.com/abcdefg301-> a.com)并强制客户端以a.com/abcdefg某种方式查看?
nemec

谢谢!在IE11,Firefox 52,Safari 10,Chrome 57上进行了测试
Munhitsu '17

我曾想同时使用a.com和b.com。因此,b.com 301 a.com不是一个选择。我们的解决方案是迁移到
HTTPS-

6

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

  1. Ctrl + Shift + Del
  2. --
    1. Chrome:选择“浏览历史记录”和“缓存...”
    2. IE:我保留默认选项“ Internet临时文件和网站文件”,“ Cookie和网站数据”,“历史记录”
    3. FF:“浏览和下载历史记录”,“缓存”
  3. 点击“删除”
  4. 关闭并重新打开浏览器。它应该工作

您还应确保您不在相关页面上,因为某些浏览器不会从打开的页面中清除缓存的项目。
奥利弗·史默

6

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


此文件已被下调,可能是因为“专用窗口”的主要承诺不是写至缓存,而是仍然可以读取/重用它们。但是在Firefox 37.0.1(Linux)上对我来说却有效,并且非常快捷和有用。专用窗口反映了Web服务器的当前/未缓存设置,而普通浏览器选项卡使用缓存的301重定向。
alfonx

alfonx:专用窗口可能不会仅仅因为服务器所有者可以以cookie的方式使用元素来显示该用户的先前身份而重用缓存。尽管我必须承认,缓存的重用可能对讨厌色情的妻子是安全的。
Zdenek

6
如果您已经有一个缓存的301,这将不起作用。私有确实会使用缓存的重定向。
jeffmcneill '16

1

使用隐身/私有模式测试重定向,因此当您关闭浏览器时,它将刷新该缓存,而重新打开窗口将不包含该缓存。


1

如其他答案所示。缓存可能在浏览器中不确定。这是非常危险的。所以不要这样做。至少添加缓存头。在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>

1

为了解决本地主机地址的问题,我更改了站点运行所在的端口号。这适用于Chrome 73.0.3683.86版。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.