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

时间:2012-02-03 14:42:50

标签: 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,因此他们将无法访问example1.com或{{ 1}}直到他们的缓存被清除。经过调查,我发现没有设置example2.comCache-Control标头。不正确的301响应的标题应该是这样的:

Expires

我自己的测试表明:

  • IE7,IE8,Android 2.3.4根本不缓存。
  • Firefox 18.0.2,Safari 5.1.7(在Windows 7上)和Opera 12.14全部缓存,并在浏览器重启时清除缓存。
  • IE10和Chrome 25缓存,但不清楚浏览器重启,那么什么时候会清除?

17 个答案:

答案 0 :(得分:266)

至少有两个浏览器 - Chrome和Firefox - 会缓存301重定向没有过期日期

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

您可以至少在Firefox中验证这一点,方法是转到about:cache并在磁盘缓存下找到它。

我不知道其他浏览器的行为,例如IE10 / IE11。但是,鉴于其他浏览器无限期地缓存它,您无论如何都必须适应这种情况。

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

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

如果您不希望缓存重定向

在无Cache-Control标头的情况下,这种无限期缓存只是这些浏览器的默认缓存。逻辑是你指定一个“永久”重定向,而不是给他们任何其他缓存指令,所以他们会把它当作你想要无限期缓存的那样对待。

如果指定了浏览器,浏览器仍然会像使用任何其他响应一样尊重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,您可能会发现边缘情况,“永久”重定向有时间限制。

如果您之前发布过301重定向但想要取消

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

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

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

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

  • 如果您无法控制上一个重定向目标所在的网站,那么您将失去运气。请尝试并请求网站所有者重定向到您。

此外,预防胜于治疗 - 如果您不确定是否要永久取消旧网址,请避免使用301重定向。

答案 1 :(得分:229)

要清除永久重定向,请转到chrome:// net-internals。在顶部红色状态栏的右侧,单击向下箭头▼打开下拉菜单,然后在"工具"分组,选择"清除缓存"。

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

更新:遗憾的是,自版本71(2018年12月)起,Google已删除了net-internals功能。

答案 2 :(得分:84)

答案可以帮助那些迫切想要摆脱重定向缓存的人:

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

  • 打开 DevTools (按F12
  • 网络标签上检查“停用缓存”复选框
  • 保持DevTools打开并重新加载页面(按F5

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

这在Chrome 39中对我有用,但遗憾的是不适用于localhost。

答案 3 :(得分:27)

让用户在该网址上提交帖子表单,缓存的重定向消失了:)

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

答案 4 :(得分:22)

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

答案 5 :(得分:8)

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

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

network call context menu

答案 6 :(得分:7)

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

答案 7 :(得分:7)

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

一个快速的胜利是,如果可以,则可以在浏览器控制台中输入该数字:

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

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

或者,如果您可以访问上一个301重定向页面,则可以将此脚本添加到该页面中,并且在每次访问该脚本时,都会忘记缓存的301。

答案 8 :(得分:6)

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

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

答案 9 :(得分:5)

作为@thomasrutter的答案

  

如果您之前发布过301重定向但想要取消

     

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

     
    

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

         

浏览器会意识到它会被引导回原先认为已退役的网址,这会导致它再次重新获取该网址,以确认旧的重定向仍未存在。

         

如果您无法控制之前重定向目标所在的网站,那么您将无法运气。请尝试并请求网站所有者重定向回您。

  

事实上,这意味着:

  1. a.com 301 to b.com

  2. 删除a.com&#39;

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

  4. 然后它有效。

答案 10 :(得分:4)

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

转到网址:

chrome://settings/clearBrowserData

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

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

答案 11 :(得分:2)

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

Screenshot of chrome opening the net-internals page

答案 12 :(得分:1)

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

答案 13 :(得分:1)

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

答案 14 :(得分: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>

答案 15 :(得分:0)

在你的 .htaccess 文件中试试这个:

public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {
    Camera camera;
    SurfaceHolder holder;
    public ShowCamera(Context context, Camera camera) {
        super(context);
        this.camera=camera;
        holder =getHolder();
        holder.addCallback(this);
    }

    @Override
    public void surfaceCreated(@NonNull SurfaceHolder holder) {
        Camera.Parameters params = camera.getParameters();

        if (this.getResources().getConfiguration().orientation!= Configuration.ORIENTATION_LANDSCAPE)

        {
            params.set("orientation", "portrait");
            camera.setDisplayOrientation(90);
            params.setRotation(90);
        }
        else
        {
            params.set("orientation", "landscape");
            camera.setDisplayOrientation(0);
            params.setRotation(0);
        }
        camera.setParameters(params);
        try {
            camera.setPreviewDisplay(holder);
            camera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(@NonNull SurfaceHolder holder) {

    }
}

答案 16 :(得分:-2)

清除浏览历史记录或禁用缓存都对我不起作用。

要摆脱301重定向,我必须在Chrome中使用Clear site data

enter image description here