Apache 缓存阻止.htaccess重定向
我想将我的网页上的所有流量从www重定向到非www。因此,每个到Apache 缓存阻止.htaccess重定向,apache,.htaccess,redirect,mod-rewrite,url-rewriting,Apache,.htaccess,Redirect,Mod Rewrite,Url Rewriting,我想将我的网页上的所有流量从www重定向到非www。因此,每个到www.example.com的请求都将重定向到example.com 这是在my.htaccess中完成的(取自此) 问题是,我以前在.htaccess文件中没有这个规则。因此,如果用户以前使用www.example.com访问过网站,那么现在缓存似乎阻止了重定向到example.com,而www URL则保留在地址栏中 但是,如果我打开一个私有浏览器窗口或清除网站数据,重定向将按预期工作 我已经在Chrome(88.0.4324
www.example.com
的请求都将重定向到example.com
这是在my.htaccess中完成的(取自此)
问题是,我以前在.htaccess文件中没有这个规则。因此,如果用户以前使用www.example.com
访问过网站,那么现在缓存似乎阻止了重定向到example.com
,而www URL则保留在地址栏中
但是,如果我打开一个私有浏览器窗口或清除网站数据,重定向将按预期工作
我已经在Chrome(88.0.4324.192)和Firefox(86.0)中对其进行了测试,两种浏览器都显示出相同的行为。操作系统:macOS 10.15.7
如何从服务器端的角度解决这个问题?因为我不能告诉所有用户清除他们的缓存
复制步骤:
www.example.com
www.example.com
(浏览器应在上次访问的历史记录中包含此地址)。不会重写到example.com
编辑:
可能会出现这种情况,因为浏览器已经缓存了
www.example.com
的内容,因此甚至不请求服务器。但是问题仍然是一样的。如果他们的计算机已经缓存了该网站,这将非常困难。事实上,不可能强制刷新,因为我假设您没有将其放入代码中
现在可以做的是在代码中包含一条规则,强制定期清除缓存。这样,您将来的更新将不会面临相同的问题 或者您也可以完全禁用缓存,这并不理想,但取决于您和您的设计 --在HTML中 上面两个代码之间的区别是
公共
和私有
,这表明任何人(公共
)或仅仅是最终用户(私有)都可以缓存到
最大年龄(时间以秒为单位)
但这也可以用其他几种语言显式实现。下面是一个PHP示例
<?php
Header("Cache-Control: must-revalidate");
$offset = 60 * 60 * 24 * 3;
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
Header($ExpStr);
?>
以下是一些链接,可以帮助您更好地了解其工作原理
不会对example.com进行重写
无法复制此内容。你有代理或缓存插件吗?@anubhava我不知道。我不使用Chrome或Firefox作为我的个人浏览器,只是为了测试。因此,他们是一个干净的安装没有任何额外的,没有插件。使用Firefox的同事可能会重复这个问题。我已经添加了我在问题中使用的浏览器版本。我认为www.example.com
在浏览器历史记录中,而example.com
不在浏览器历史记录中,这一点也很重要。很可能是某些客户端使用缓存版本,不会立即跟随您的重定向。不过,这与重写规则无关。相反,缓存中的内容的日期是该重定向规则之前的时间。因此,只有新客户端才能看到该规则或缓存内容已过期或已删除的客户端。那么,您的意思是,无法强制对现有客户端使用此新重定向规则?“在代码中包含一条规则,强制定期清除缓存”-您是如何做到的?您的代码是用什么语言编写的?我不是OP,但在原则上,不管脚本语言如何,您是如何做到这一点的?正如你在第一句中所说,“不可能强制刷新”,所以我很好奇你所说的“定期缓存清除”是什么意思?谢谢你的详细回答,我想我会通过实现html缓存控制来防止这些类型的缓存问题,而不是完全没有缓存,但是有时间限制。@White先生,我想他的意思是,在页面已经缓存之后,我不能强制刷新。但是对于将来的缓存,我可以实现一些东西,定期触发刷新缓存。我想这可以在HTML中用那些httpequiv
meta标记来完成?(答案包括如何完全关闭缓存的示例,但不包括如何配置缓存持续时间)
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
Cache-Control : public, max-age=3600;
Cache-Control : private, max-age=3600;
<?php
Header("Cache-Control: must-revalidate");
$offset = 60 * 60 * 24 * 3;
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
Header($ExpStr);
?>