.htaccess重定向问题:真实文件URL未跳转至友好URL
解决.htaccess友好URL重定向循环问题
这个循环问题的根源很清晰:当你直接写RewriteRule ^plans5.php$ /buy-things-online [R=301,L]时,浏览器跳转到友好URL后,你的内部重写规则又把它转回plans5.php,服务器接着又触发重定向,往复下去就导致了"too many redirects"错误。
要解决这个问题,我们需要区分用户的外部请求和服务器内部的重写操作——只有当用户实际请求plans5.php这个真实地址时,才执行301重定向;而内部重写的情况则跳过重定向规则。
具体可以通过%{THE_REQUEST}这个服务器变量来实现,它记录的是用户发送的原始请求,不会被内部重写修改。
完整的.htaccess配置示例
# 先处理301重定向:仅当用户实际请求plans5.php时跳转 RewriteCond %{THE_REQUEST} ^GET\ /plans5\.php\ HTTP/ RewriteRule ^plans5\.php$ /buy-things-online [R=301,L] # 然后处理内部重写:友好URL映射到真实文件 RewriteRule ^buy-things-online$ plans5.php [L]
规则解释
重定向规则:
RewriteCond %{THE_REQUEST} ^GET\ /plans5\.php\ HTTP/:检查用户的原始请求是否是直接访问/plans5.php,用正则匹配确保只针对外部请求。RewriteRule ^plans5\.php$ /buy-things-online [R=301,L]:满足条件时,301永久重定向到友好URL,L标记表示这是最后一条规则,停止后续处理。
内部重写规则:
- 当用户访问友好URL
/buy-things-online时,服务器内部悄悄加载plans5.php,URL保持不变,这和你原来的正常逻辑一致。
- 当用户访问友好URL
注意事项
- 记得清除浏览器缓存再测试,因为301重定向会被浏览器缓存,之前的错误缓存可能影响测试结果。
- 确保重定向规则一定要放在内部重写规则之前,顺序不对会导致逻辑失效。
内容的提问来源于stack exchange,提问作者Static Volt
相关产品推荐
相关产品推荐

