PHP网站URL重定向问题求助:旧动态URL转友好URL失败
解决动态URL到静态URL的重定向问题
问题根源
你写的RewriteRule无法匹配目标URL,因为RewriteRule默认仅匹配URL的路径部分(?之前的内容),?后面的查询字符串必须通过RewriteCond结合%{QUERY_STRING}变量来匹配。
正确的.htaccess配置
替换原有重定向规则为以下内容,即可精准匹配指定动态URL并跳转到静态地址:
RewriteEngine On # 保留原有HTTPS强制跳转规则 RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 匹配指定动态URL,重定向到/blog RewriteCond %{QUERY_STRING} ^page=show&ex=2&dir=docs&lang=2&ser=1&cat=70&act=70&?$ RewriteRule ^index\.php$ https://example.com/blog? [L,R=301,QSD] # 若需重定向到/company-exhibition,替换目标地址即可: # RewriteCond %{QUERY_STRING} ^page=show&ex=2&dir=docs&lang=2&ser=1&cat=70&act=70&?$ # RewriteRule ^index\.php$ https://example.com/company-exhibition? [L,R=301,QSD]
配置细节说明
RewriteCond %{QUERY_STRING} ^page=show&ex=2&dir=docs&lang=2&ser=1&cat=70&act=70&?$:精准匹配查询字符串,末尾的&?兼容URL末尾有无多余&的情况。RewriteRule ^index\.php$:匹配路径部分的index.php,注意.需转义为\.(正则中.是通配符)。- 目标地址末尾加
?或使用QSD参数:二者均用于丢弃原查询字符串,避免重定向后URL携带旧参数。 R=301为永久重定向,适合正式环境;测试阶段建议先用R=302(临时重定向),避免浏览器缓存影响测试结果。
额外注意事项
- 确认Apache服务器已开启
mod_rewrite模块。 .htaccess需放置在网站根目录,且服务器允许使用该文件(检查httpd.conf中的AllowOverride All配置)。- 若之前使用过301重定向测试,需清空浏览器缓存后再验证新规则,浏览器会缓存永久重定向结果。
内容的提问来源于stack exchange,提问作者Ja Ga
相关产品推荐
相关产品推荐

