我正在调试HTTP 301永久重定向的问题。经过快速测试后,似乎Safari在重启时清除了301s的缓存,但Firefox没有。
IE,Chrome,Firefox和Safari什么时候清除301s的缓存?
更新:例如,如果我想将example1.com
重定向到example2.com
,但我不小心将其设置为重定向到example3.com
,这是一个问题。我可以更正错误,但在此期间访问example1.com
的任何人都会将错误的重定向缓存到example3.com
,因此他们将无法访问example1.com
或{{ 1}}直到他们的缓存被清除。经过调查,我发现没有设置example2.com
和Cache-Control
标头。不正确的301响应的标题应该是这样的:
Expires
我自己的测试表明:
答案 0 :(得分:266)
至少有两个浏览器 - 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重定向。这些并不意味着浏览器或缓存它们是“永久”重定向,因此不应缓存在缓存控制标头中。
对我而言,似乎发布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重定向(在本地磁盘缓存中)。要清除此缓存:
F12
)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-Control
和Expires
来执行相同的操作。或者,如果您根本不想缓存301
响应,请使用以下标题。
Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
答案 5 :(得分:8)
答案 6 :(得分:7)
出于测试目的(避免缓存重定向),人们可以打开新的私有窗口:点击CTRL+SHIFT+
N
[如果您使用Mozilla ,使用 P
]
答案 7 :(得分:7)
确认!!让用户向受影响的网址提交发布请求,而忘记了缓存的重定向。
一个快速的胜利是,如果可以,则可以在浏览器控制台中输入该数字:
fetch('example.com/affected/link', {method: 'post'}).then(() => {})
如果您知道受影响的浏览器(特别是在开发过程中),则很有用。
或者,如果您可以访问上一个301重定向页面,则可以将此脚本添加到该页面中,并且在每次访问该脚本时,都会忘记缓存的301。
答案 8 :(得分:6)
我有简单的解决方案适用于所有主流浏览器(最新版本),包括IE,Chrome和FF
答案 9 :(得分:5)
作为@thomasrutter的答案
如果您之前发布过301重定向但想要取消
如果人们仍然在浏览器中使用缓存301重定向,则无论源页面是否仍具有重定向,它们都将继续被带到目标页面。您解决此问题的方法包括:
最简单和最好的解决方案是再次发回另一个301重定向。
浏览器会意识到它会被引导回原先认为已退役的网址,这会导致它再次重新获取该网址,以确认旧的重定向仍未存在。
如果您无法控制之前重定向目标所在的网站,那么您将无法运气。请尝试并请求网站所有者重定向回您。
事实上,这意味着:
a.com 301 to b.com
删除a.com&#39;
将b.com 301添加到a.com
然后它有效。
答案 10 :(得分:4)
我将发布对我有帮助的答案:
转到网址:
chrome://settings/clearBrowserData
它应该先调用弹出窗口,然后..
cached images and files
。from beginning
答案 11 :(得分:2)
答案 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)