缓存阻止.htaccess重定向

qrjkbowd  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(113)

我想将我网页上的所有流量从www重定向到非www。因此,每个发往www.example.com的请求都将被重定向到example.com
这是在我的.htaccess中完成的(取自此question

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

问题是,我以前在.htaccess文件中没有这个规则,所以如果用户以前使用www.example.com访问网站,现在缓存似乎阻止重定向到example.com,而www URL保留在地址栏中。
但是,如果我打开一个私人浏览器窗口或清除网站数据,重定向工作如预期。
我已经在Chrome(88.0.4324.192)和Firefox(86.0)上进行了测试,两种浏览器都显示了相同的行为。操作系统:macOS 10.15.7操作系统
我如何从服务器端的Angular 解决这个问题呢?因为我不能告诉所有用户清除他们的缓存。

复制步骤:

1.清除浏览器中的缓存历史记录以启动干净会话
1.打开www.example.com
1.将重写规则www添加到.htaccess文件中的非www
1.再次打开www.example.com(浏览器应该在上次访问的历史记录中有这个地址)。不会重写example.com

**EDIT:**可能会发生这种情况,因为浏览器已经缓存了www.example.com的内容,因此甚至没有请求服务器。但是问题仍然存在。

thtygnil

thtygnil1#

如果他们的计算机已经缓存了网站,这将是非常困难的。事实上,不可能强制刷新,因为我假设你没有把它放在你的代码。
你现在可以做的是在你的代码中加入一个规则,强制定期清除缓存,这样,你将来的更新就不会遇到同样的问题。
或者,您也可以完全禁用缓存,这并不完全理想,但取决于您和您的设计

  • -在HTML中
<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" />
  • -在. htaccess中
<IfModule mod_headers.c>
  Header set Cache-Control "no-cache, no-store, must-revalidate"
  Header set Pragma "no-cache"
  Header set Expires 0
</IfModule>

从此链接查找其他语言的其他选项;

另一个过度杀伤的解决方案是;
如果你的网站上有任何东西做数据库检查,结果加载一个新的页面,例如用户会话检查或登录;你可以通过修改他们的数据库记录来利用这一点,这样他们将被强制进入登录页面。这将强制他们在到达那里时重新加载,并且当他们被强制重新加载时,他们的数据被恢复。
这是最后的手段,但如果世界依赖它,当然,否则。放松与第一个解决方案。人们不会永远保持缓存。

    • 更新**

正如我在之前的回复中所说,您可以在下一个版本中设置定期缓存,这可以在HTML中简单地完成。

Cache-Control : public, max-age=3600;

Cache-Control : private, max-age=3600;

上述两个代码之间的区别在于publicprivateprivate表示是任何人(public)还是只有最终用户(private)可以缓存最多max-age(以秒为单位的时间)。
但是这也可以在其他几种语言中显式地完成。

<?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);
?>

这里有一些链接,可以帮助您更好地了解它是如何工作的。

des4xlb0

des4xlb02#

您可以考虑使用302或307来代替301响应代码,这两种代码用于临时重定向。Link
默认情况下不缓存响应,除非另有说明。

相关问题