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

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

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

例如,如果我想将1.example重定向到2.example,但我意外地将其重定向到3.example,这就是一个问题。我可以纠正这个错误,但是任何在此期间访问过1.example的人都会缓存到3.example的错误重定向,因此他们将无法到达1.example2.example,直到他们的缓存被清除。经过调查,我发现没有设置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://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缓存,但不清楚浏览器重新启动,那么他们什么时候能清?
276547 次浏览

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

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

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

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

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

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

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

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

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

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

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

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

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

    如果浏览器在重定向过程中第二次被定向回同一个URL,它应该再次从原点获取该URL,而不是再次从缓存重定向,以避免重定向循环。对这个答案的评论表明,这现在在所有主要浏览器中都可以工作-但可能有一些小浏览器不能。

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

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

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

Chrome无限缓存301重定向(在本地磁盘缓存中)。清除缓存。

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

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

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

  1. Ctrl + Shift + Del
  2. <李> - - -
    1. Chrome浏览器:选择“浏览历史记录”和“缓存…”
    2. IE:我离开默认选项“临时互联网文件和网站文件”,“Cookies和网站数据”,“历史”
    3. FF:“浏览和下载历史”,“缓存”
    4. 李< / ol > < / >
    5. 点击“删除”
    6. 关闭并重新打开浏览器。应该可以

出于测试目的(避免缓存重定向),人们可以打开新的私有窗口:单击CTRL+SHIFT+N[如果您使用Mozilla,则使用P]

Chrome 71

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

Chrome 48 - 70

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

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

作为@thomasrutter的回答

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

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

最简单和最好的解决方案是再次发出301重定向。

浏览器会意识到它被引导回到它之前认为是退役的URL,这应该会导致它重新获取该URL,以确认旧的重定向不存在。

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

事实上,这意味着:

  1. a.example 301到b.example

  2. 删除a.example的301

  3. 添加b.example 301到a.example

这样就有用了。

让用户在该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>

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

正如其他答案所示,在浏览器中缓存的持续时间可能是无限的。这是非常恼人的。所以不要这么做。至少添加缓存头。在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]

确认! !让用户向受影响的url提交post请求,缓存的重定向将被遗忘。

速胜将是在浏览器控制台输入这个,如果你可以:

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

如果您了解受影响的浏览器(特别是在开发过程中),则非常有用。

另外,如果你可以访问之前的301重定向页面,那么你可以将这个脚本添加到页面中,每当它被访问时,缓存的301将被遗忘。

有一个非常简单的方法来删除浏览器缓存http重定向,如301,307等。

你可以在chrome浏览器的开发控制台打开网络面板。选择网络调用。右键单击它,然后单击清除浏览器缓存以删除缓存的重定向。

网络呼叫上下文菜单

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

我将发布帮助我的答案:

转到url:

chrome://settings/clearBrowserData

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

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

在最新的谷歌Chrome Version 79中,您可以使用chrome://net-internals 并从左侧面板选择DNS,然后点击清除主机缓存按钮

 chrome打开net-internals页面的截图

在你的。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>

对于移动Chrome浏览器(93版),有一个小技巧:尝试在“桌面站点”中打开url。模式-这在我的情况下删除了一个永久缓存重定向。

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

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