![使用环境变量和重定向循环强制清除 301 重定向](https://linux22.com/image/793996/%E4%BD%BF%E7%94%A8%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%92%8C%E9%87%8D%E5%AE%9A%E5%90%91%E5%BE%AA%E7%8E%AF%E5%BC%BA%E5%88%B6%E6%B8%85%E9%99%A4%20301%20%E9%87%8D%E5%AE%9A%E5%90%91.png)
我们错误地在一个非常重要的页面上使用了 301 重定向,现在我们想要实际使用该页面,但许多用户的浏览器的缓存中都滞留了 301。问题是重定向的目的地是网站的根目录,因此我们不能盲目地将其 301 重定向回去以破坏缓存。
我正在尝试使用第三个 URL 和环境变量来强制重定向循环,这将导致浏览器再次检查服务器。旧的 301 已被删除,但我将其包括在内(注释掉)以供参考。
我似乎遇到的问题是我尝试设置的环境变量似乎被完全忽略/从未设置,因此 RewriteCond 从不允许规则的其余部分生效。
RewriteEngine On
#fix /investments 301 redirect:
<IfModule mod_rewrite.c>
RewriteBase /
# This DOES work, I can see TEST_ENV and REDIRECT_TEST_ENV set in the SERVER variable:
# RewriteRule .* - [E=TEST_ENV:TEST,NE]
# The original rule that got us into trouble:
# RewriteRule ^investments\/?$ / [R=301,L]
# Just to be safe, set env variable again at the /investments/ route:
RewriteRule ^investments\/?$ - [E=INVESTMENTSFIX:1]
# 3rd URL is all-investments, and I want to redirect to the problem URL, where it will then go into a redirect loop
RewriteRule ^all-investments/?$ /investments/ [R=301,NC,E=INVESTMENTSFIX:1,L]
# If you land on the homepage with the env variable set, set headers to not cache, redirect back to /investments, which will cause a loop. The browser should then check the server and find that the 301 for /investments no longer applies
<If "%{ENV:INVESTMENTSFIX} == 1">
Header set Cache-Control "no-cache, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
RewriteRule ^/?$ /investments/ [R=301,NC,L]
</If>
# fix homepage once the other rules work??:
# RewriteCond %{ENV:REDIRECT_INVESTMENTSFIX} !1
# RewriteRule ^/$ / [R=301,NC,L]
</IfModule>
本地服务器设置:
- 微软XAMPP
- Apache/2.4.56(Win64)
- PHP/8.1.17
- OpenSSL/1.1.1t
如果环境变量不是解决问题的办法,那么更好的解决方案是什么?我们真的很想挽救这个 URL,因为它也是网站大部分内容的父路由。我们没有意识到 301 重定向是如此永久(意味着浏览器不会再验证重定向)。