.htaccess实现带参.php URL301重定向到.htm伪静态URL方法
.htaccess 301跳转配置方案
问题核心原因
你之前自行编写的规则无法生效,核心原因是没有区分用户直接访问.php的外部原始请求和服务器内部将.htm转发到.php的重写请求,导致重写循环,触发500错误或跳转异常。需要通过%{THE_REQUEST}服务器变量匹配用户的原始请求,才能完全避开内部重写的干扰。
可直接生效的完整配置
注意规则顺序:所有301跳转规则必须放在你原有.htm内部重写规则的最前面,顺序颠倒会导致规则失效。
RewriteEngine On # 单参数PHP页301跳转:匹配 accessories.php?lang=xxx 跳转到 accessories-xxx.htm RewriteCond %{THE_REQUEST} \s/accessories\.php\?lang=([^&\s]+)\s [NC] RewriteRule ^accessories\.php$ /accessories-%1.htm? [L,R=301] # 双参数PHP页301跳转:匹配 accessory-details.php?id=xxx&lang=xxx 跳转到 accessory-details-id-xxx-xxx.htm RewriteCond %{THE_REQUEST} \s/accessory-details\.php\?id=([^&]+)&lang=([^&\s]+)\s [NC] RewriteRule ^accessory-details\.php$ /accessory-details-id-%1-%2.htm? [L,R=301] # ----- 分割线:下方放置你原有已正常运行的.htm内部重写规则 ----- RewriteRule accessories-(.*)\.htm$ accessories.php?lang=$1 [L] RewriteRule accessory-details-id-(.*)-(.*)\.htm$ accessory-details.php?id=$1&lang=$2 [L]
规则关键说明
- 跳转规则末尾的
?是必填项:会自动丢弃原URL携带的查询字符串,避免跳转后URL末尾残留多余的GET参数 - 规则中使用
%1、%2读取RewriteCond捕获的GET参数值,不要用$1类标记,RewriteRule匹配.php路径时无法直接获取URL后的GET参数 - 给原有内部重写规则补充了
[L]标记,匹配到对应规则后会停止后续重写流程,避免多规则串扰 - 你之前贴出的内部规则中参数间的
&是HTML转义字符,实际在.htaccess文件中要直接写&,否则会出现参数传递失败的问题 - 测试阶段建议先把
R=301改成R=302(临时跳转),确认所有跳转逻辑正常后再改回R=301:301永久跳转会被浏览器强缓存,规则错误时会反复跳转到错误地址,清缓存成本高 - 双参数规则默认匹配
id在前、lang在后的参数顺序,如果你的旧URL存在lang在前id在后的情况,需要额外新增一条对应参数顺序的跳转规则,否则会匹配失败
批量适配其他文件的方法
站点下其他同类PHP文件可以直接套模板修改:
- 单参数页面(URL格式:
文件名.php?参数名=参数值,对应新静态URL格式:文件名-参数值.htm):复制单参数跳转规则块,替换对应文件名、参数名、URL前缀即可 - 双参数页面(URL格式:
文件名.php?参数1名=参数1值&参数2名=参数2值,对应新静态URL格式:文件名-参数1名-参数1值-参数2值.htm):复制双参数跳转规则块,替换对应文件名、参数名、URL前缀即可
内容的提问来源于stack exchange,提问作者Kiko
相关产品推荐
相关产品推荐

