问题描述
我想将我网页上的所有流量从 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
如何从服务器端的角度解决这个问题?因为我不能告诉所有用户清除他们的缓存。
重现步骤:
- 清除浏览器中的缓存和历史,以开始一个干净的会话
- 打开
www.example.com
- 将重写规则 www 添加到 .htaccess 文件中的非 www
- 再次打开
www.example.com
(浏览器应该在上次访问的历史记录中包含此地址)。不会重写example.com
。
编辑:
可能会发生这种情况,因为浏览器已经为 www.example.com
缓存了内容,因此甚至不会请求服务器。但是问题依旧。
解决方法
如果他们的电脑已经缓存了网站,那就真的很难了。事实上不可能强制刷新,因为我假设你没有把它放在你的代码中。
您现在可以做的是在您的代码中包含一个规则,该规则将强制定期清除缓存。这样,您以后的更新就不会遇到同样的问题。
或者您也可以完全禁用缓存,这并不理想,但这取决于您和您的设计
--在 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" />
--in .htaccess
<IfModule mod_headers.c>
Header set Cache-Control "no-cache,must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
从此链接中查找其他语言的其他选项;
http://cristian.sulea.net/blog/disable-browser-caching-with-meta-html-tags/
另一个矫枉过正的解决方案是;
如果您的网站上有任何内容进行数据库检查并且结果加载了一个新页面,例如用户会话检查或登录;您可以通过修改他们的数据库记录来利用这一点,以强制他们进入登录页面。这将迫使他们在到达那里时重新加载,当他们被迫重新加载时,他们的数据将被恢复。
这是最后的手段,但如果世界确实依赖它,否则。放松与第一个解决方案。人们不会永远保留缓存。
更新
正如我在之前的回复中所说,您可以在下一个版本中设置定期缓存。这可以简单地在 HTML 中完成。
Cache-Control : public,max-age=3600;
Cache-Control : private,max-age=3600;
上述 2 个代码之间的区别是 public
和 private
,它们表示是任何人 (public
) 还是最终用户 (private') can cache up to the
max-age` (时间以秒为单位)。
但这也可以在其他几种语言中明确完成。这是 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);
?>
这里有一些链接可以帮助您更好地了解其工作原理。 https://www.mnot.net/cache_docs/#META https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching,https://imagekit.io/blog/ultimate-guide-to-http-caching-for-static-assets/,https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching