如何用.htaccess RewriteRule实现URL美化并避免重定向循环?
解决.htaccess重定向循环与URL伪装问题
错误原因分析
你之前的配置出现ERR_TOO_MANY_REDIRECTS是因为两条规则形成了无限循环:
- 第一条规则将
somespecificfile.php重定向到abc,浏览器地址栏更新后发起新请求 - 第二条规则将
abc内部重写回somespecificfile.php,但此时服务器会再次匹配第一条规则,继续触发重定向,循环往复
仅保留第一条规则时出现404,是因为重定向到abc后,服务器没有对应规则处理这个路径,找不到资源。
正确配置方案
使用%{THE_REQUEST}变量判断原始请求(该变量记录浏览器发送的初始请求信息,不会被内部重写修改),避免内部重写触发重定向规则:
# 外部重定向:仅对浏览器直接访问somespecificfile.php的请求生效 RewriteCond %{THE_REQUEST} ^GET\ /somespecificfile\.php [NC] RewriteRule ^somespecificfile\.php$ /abc [R=301,L,QSA] # 内部重写:访问abc时,服务器实际加载somespecificfile.php的内容 RewriteRule ^abc$ /somespecificfile.php [L,QSA]
配置说明
- 第一条规则:
RewriteCond %{THE_REQUEST} ^GET\ /somespecificfile\.php [NC]:只匹配浏览器发送的包含somespecificfile.php的GET请求,忽略大小写R=301:永久重定向(如果只是临时需求,可改为R=302),L表示执行完这条规则后停止后续处理,QSA自动保留查询参数(如v=1)
- 第二条规则:将
abc路径内部映射到somespecificfile.php,地址栏不变,同时保留查询参数
测试场景验证
- 访问
/somespecificfile.php?v=1:浏览器地址栏自动变为/abc?v=1,服务器加载对应PHP文件内容 - 直接访问
/abc?v=1:地址栏保持不变,服务器正常加载PHP文件内容 - 无循环重定向问题,因为内部重写后的请求不会触发第一条规则的条件
注意:如果之前使用过302重定向,测试新配置前建议清除浏览器缓存,避免旧重定向规则干扰。
内容的提问来源于stack exchange,提问作者Jaxx0rr
相关产品推荐
相关产品推荐

