缓存阻止 .htaccess 重定向
Cache prevents .htaccess redirect
我想将我网页上的所有流量从 www 重定向到非 www。因此,每个发送到 www.example.com
的请求都将被重定向到 example.com
.
这是在我的 .htaccess 中完成的(取自此 question)
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/ [R=301,L]
问题是,我以前的 .htaccess 文件中没有这条规则。因此,如果用户以前使用 www.example.com
访问该网站,现在缓存似乎会阻止重定向到 example.com
,而是 www URL 保留在地址栏中。
如果我打开私人浏览器 window 或清除网站数据,重定向会按预期工作。
我已经在 Chrome (88.0.4324.192) 和 Firefox (86.0) 两种浏览器中进行了测试表现出相同的行为。 OS: macOS 10.15.7
如何从服务器端的角度解决这个问题?因为我不能告诉所有用户清除他们的缓存。
重现步骤:
- 清除浏览器中的缓存和历史以开始一个干净的会话
- 打开
www.example.com
- 在 .htaccess 文件中添加重写规则 www 到非 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" />
--在.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>
从此 link;
找到其他语言的其他选项
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;
上面两个代码之间的区别是 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);
?>
这里有一些 link 可以帮助您更好地了解其工作原理。 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
我想将我网页上的所有流量从 www 重定向到非 www。因此,每个发送到 www.example.com
的请求都将被重定向到 example.com
.
这是在我的 .htaccess 中完成的(取自此 question)
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/ [R=301,L]
问题是,我以前的 .htaccess 文件中没有这条规则。因此,如果用户以前使用 www.example.com
访问该网站,现在缓存似乎会阻止重定向到 example.com
,而是 www URL 保留在地址栏中。
如果我打开私人浏览器 window 或清除网站数据,重定向会按预期工作。
我已经在 Chrome (88.0.4324.192) 和 Firefox (86.0) 两种浏览器中进行了测试表现出相同的行为。 OS: macOS 10.15.7
如何从服务器端的角度解决这个问题?因为我不能告诉所有用户清除他们的缓存。
重现步骤:
- 清除浏览器中的缓存和历史以开始一个干净的会话
- 打开
www.example.com
- 在 .htaccess 文件中添加重写规则 www 到非 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" />
--在.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>
从此 link;
找到其他语言的其他选项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;
上面两个代码之间的区别是 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);
?>
这里有一些 link 可以帮助您更好地了解其工作原理。 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