避免 301 重定向缓存

Posted

技术标签:

【中文标题】避免 301 重定向缓存【英文标题】:Avoiding 301 redirect caching 【发布时间】:2012-02-19 16:00:34 【问题描述】:

这是Using 301/303/307 redirects for dynamic short urls 的后续问题,我在其中尝试确定在目标 URL 频繁更改时实现短 URL 重定向的最佳方法。

虽然 301 和 307 重定向似乎都以相同的方式执行,但我担心的问题是 301 重定向缓存(如文档所述 here)- 是避免这种情况的最佳方法,而是使用 307 重定向(我假设 307 重定向永远不会缓存?),还是显式发送 no-cache 标头(“Cache-Control: no-cache, must-revalidate”)?

【问题讨论】:

相关:***.com/questions/12192590/… 【参考方案1】:

不要试图避免 301 缓存。如果您不希望任何用户代理缓存您的重定向,那么就不要使用 301 重定向。换句话说,301 缓存将继续存在,从语义上讲,它是一个 永久 重定向,因此如果您打算更改目标 URL,则 301 不是要使用的正确状态代码。另一方面,307 responses are not cached by default。

【讨论】:

您的解释违反了 HTTP 规范。当Cache-Control 出现在 301 上时,客户必须关注它。 RFC 说“301(永久移动)状态代码表明目标资源已被分配一个新的永久 URI”,所以是的,这意味着它是永久的。当然,从技术上讲,您可以将其用于其他目的,但是您误用了 HTTP 语义。 您对名称的解读过多。没有什么事情是永远的。域名被出售。公司破产。甚至有技术限制阻止了这一点:tools.ietf.org/html/draft-ietf-httpbis-p6-cache-24#page-28[...] extremely large values have been demonstrated to cause problems [...] 总之:Forever 只是意味着until the resource is deleted, or a reasonably long time. 您遗漏了最后一点:301 是 URI 规范化的唯一合理响应。代码 303307 要求客户端在原始 URI 上重复请求(破坏 URI 规范化点):tools.ietf.org/html/… Since the redirection can change over time, the client ought to continue using the original effective request URI for future requests. URI 规范化意味着客户端应该能够使用规范 URI 而不是重定向的别名给他们。代码 303307 可以防止这种情况发生。 你说对了一件事:OP想要在不缓存的情况下重定向。在这种情况下,307 是更好的解决方案。我只是说301Cache-Control 标头是完全合理的,不应排除其他用途。【参考方案2】:

在您希望 301 重定向带来的行为的情况下,例如更新浏览器书签和更改 google bot 中的 URL,但同时希望跟踪重定向或执行一些其他类型的功能,您可以始终将缓存控制标头添加到“无缓存”

HTTP/1.0 301 Moved Permanently
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Location: http://example.com

php 中是这样的:

header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Location:'.$url, true, 301);

相关: https://***.com/a/19003320/175071

【讨论】:

以上是关于避免 301 重定向缓存的主要内容,如果未能解决你的问题,请参考以下文章

浏览器如何使用查询字符串缓存 301 重定向

Firefox 5“缓存”301 重定向

如何撤消 301 重定向?

由于浏览器缓存,PHP 标头 301 重定向不起作用

从客户端缓存中删除 http 301 重定向

无法移除 301 重定向