ExpressionEngine站点.htaccess中RewriteRule与301跳转冲突如何解决
冲突原因
你遇到的问题是不同Apache模块指令执行逻辑冲突导致的:Redirect属于mod_alias模块的指令,和mod_rewrite的规则独立执行,哪怕跳转规则写在最前,后续mod_rewrite把路径重写为/index.php?/旧路径后,mod_alias的跳转逻辑依然会拼接原始路径,最终生成带异常参数的跳转地址。
解决方法
将所有301跳转改为用mod_rewrite规则实现,调整规则顺序保证跳转匹配后终止后续重写逻辑,修改后的完整.htaccess配置如下:
RewriteEngine On # 旧页面301跳转区 新增跳转都写在此区域 RewriteRule ^in-loving-memory-of-our-partners/?$ / [R=301,L,NC] # HTTP转HTTPS RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L] # 非www域名转www RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] # sitemap规则 RewriteRule ^sitemap\.xml$ /sitemap/xml [NC,L] # .well-known路径豁免 移到重写规则前避免被拦截 RewriteRule ^(.well-known) - [L] # 原站点URL重写规则 保证站点导航正常 RewriteCond $1 !^(assets|emergency|portalimages|images|system|themes|test|AUL|swfs|favicon\.ico|robots\.txt|index\.php) [NC] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?/$1 [L]
改动说明
- 原来两条分别匹配带/和不带/的Redirect规则,合并为一条
RewriteRule,末尾的/?可同时匹配两种路径格式,L标记表示匹配到跳转后直接终止后续规则执行,不会进入后面的index.php重写逻辑 - 调整了
.well-known规则的顺序,避免它被前面的重写规则拦截,保证证书验证等功能正常 - 所有跳转统一用
mod_rewrite处理,彻底避免不同模块的执行逻辑冲突
测试注意事项
301是永久跳转,浏览器会本地缓存旧的跳转结果,修改配置后建议清空浏览器缓存或者用无痕模式测试,避免缓存干扰判断。
内容的提问来源于stack exchange,提问作者BB Design
相关产品推荐
相关产品推荐

