设置定时重定向至过期页却触发无限重定向循环问题求助
解决Apache Rewrite无限重定向循环问题
嘿,我来帮你拆解问题出在哪,以及怎么修复:
核心问题:排除条件的正则匹配错误
你陷入无限循环的根本原因是第二个RewriteCond的正则写得不对,导致过期页面本身也被触发了重定向。
- Apache的
%{REQUEST_URI}变量值始终是以/开头的,比如用户访问过期页面时,这个变量的值是/en-gb/expired。 - 你当前的排除条件是
%{REQUEST_URI} !en-gb/expired$ [NC],这个正则是检查字符串末尾是否为en-gb/expired,但实际REQUEST_URI是/en-gb/expired,前面多了个/,所以这个正则根本匹配不上过期页面的路径。 - 结果就是:哪怕用户已经访问了
/en-gb/expired,排除条件依然成立,RewriteRule会再次把它重定向到同一个页面,无限循环就这么产生了。
次要问题:目标URL的拼写笔误
你提到的目标URL是https://mywebsite.com/en-gb/exipred,但RewriteRule里写的是/en-gb/expired——这里有个拼写错误(exipred vs expired),虽然这不是循环的直接原因,但会导致用户被重定向到不存在的页面,得注意修正。
修正后的配置
把排除条件的正则改成精准匹配过期页面的完整路径,同时建议测试阶段用R=302临时重定向(避免浏览器缓存301永久重定向导致测试不生效):
# 时间条件:当当前时间晚于2019-04-18 15:40时触发 RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR}%{TIME_MIN} >201904181540 [NC] # 精准排除过期页面,确保它不会被重定向 RewriteCond %{REQUEST_URI} !^/en-gb/expired$ [NC] # 重定向所有其他请求到过期页面 RewriteRule ^(.*)$ /en-gb/expired [L,R=302]
为什么修改RewriteRule为^/$或^$无效?
这两个正则只能匹配网站根路径(也就是https://mywebsite.com/),像/en-gb、/en-gb/home这些子路径根本不会被匹配到,所以重定向规则自然就被忽略了,达不到你全站重定向的需求。
额外建议
等你确认配置正常工作后,再把R=302改成R=301永久重定向,这样搜索引擎也会更新索引。
内容的提问来源于stack exchange,提问作者petron
相关产品推荐
相关产品推荐

