.htaccess配置301重定向旧URL被追加到新URL问题求助
问题根源
- 规则执行顺序错误:你将单页重定向规则放在了框架入口路由规则之后,
!-f !-d的规则命中不存在的/contactus/路径后,携带[L]标记终止了后续所有规则执行,导致末尾的重定向规则完全不会生效 - mod_alias与mod_rewrite混用冲突:mod_alias的执行优先级高于mod_rewrite,使用
Redirect规则触发跳转时,mod_rewrite已经将旧路径拼接为查询参数传递,就会出现跳转后URL末尾追加旧路径的问题 - 冗余配置:整个.htaccess文件内仅需声明一次
RewriteEngine On即可,重复声明不会提升执行效率,反而容易导致规则逻辑混乱
修复后的完整配置
<IfModule mod_security.c> SecFilterEngine Off SecFilterScanPOST Off </IfModule> RewriteEngine On # HTTP转HTTPS RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://example.com/$1 [R=301,L] # WWW跳转根域名 RewriteCond %{HTTP_HOST} ^www.example.com [NC] RewriteRule ^(.*)$ https://example.com/$1 [L,R=301] # 单页静态重定向,放在框架入口规则之前 RewriteRule ^contactus/$ https://example.com/contact-us/ [R=301,L,QSD] # 框架入口路由规则 RewriteCond %{REQUEST_URI} ^/system.* RewriteRule ^(.*)$ index.php?/$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)$ index.php?/$1 [L]
验证注意事项
- 修改配置后先清空浏览器缓存,301永久重定向会被浏览器长期缓存,测试阶段可以先将
R=301改为R=302,确认跳转逻辑正常后再改回301 - 若你的Apache版本低于2.4,不支持
QSD标记,可以在重定向目标URL末尾加?,即https://example.com/contact-us/?,同样可以清除多余的查询参数
内容的提问来源于stack exchange,提问作者Bilal Arshad
相关产品推荐
相关产品推荐

