至少有两个浏览器 - Chrome和Firefox - 将缓存301重定向,但没有过期日期。
也就是说,只要浏览器的缓存可以容纳缓存,它就会保持缓存状态。如果手动清除缓存,或者清除缓存条目以便为新缓存条目腾出空间,它将从缓存中删除。
你可以通过访问about:cache并在磁盘缓存下找到它来至少在Firefox中验证这一点。
我不知道其他浏览器的行为,例如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重定向。这些并不意味着它们是“永久”重定向的浏览器或缓存,因此不应缓存在缓存控制头的缺失中。
对我来说,似乎发布301重定向但将其标记为不可缓存是违背301重定向的精神,即使它可能在技术上有效。 YMMV,您可能会发现边缘情况,“永久”重定向有时间限制。
如果您之前发布了301重定向但想要取消该重定向
如果人们仍然在浏览器中拥有缓存301重定向,则无论源页面是否仍具有重定向,它们都将继续被带到目标页面。您解决此问题的方法包括:
最简单和最好的解决方案是再次发出另一个301重定向。
浏览器将意识到它被引导回到它之前认为是取消委托的URL,这应该导致它再次重新获取该URL以确认旧的重定向不存在。
编辑:有些评论对此表示怀疑,见下文。
如果您无法控制上一个重定向目标所在的站点,那么您将无法运气。尝试并请求网站所有者重定向回您。
此外,预防胜于治疗 - 如果您不确定是否要永久取消旧URL,请避免301重定向。