Magento站点添加mod_rewrite规则实现短URL跳转时出现循环问题的原因及解决办法
Magento站点添加mod_rewrite规则实现短URL跳转时出现循环问题的原因及解决办法
嗨,我来帮你捋清楚这个循环问题的根源,以及怎么搞定它!
问题原因
你的短URL规则本身逻辑是对的,但之所以出现循环,主要有两个核心原因:
- Magento的.htaccess最后有一条兜底规则,会把所有非静态资源(非文件、非目录、非软链接)的请求转发到
index.php,而内部重写后的请求会重新走一遍mod_rewrite规则链。 - 你没有添加排除条件,导致重写到
cartroute/cartlink后的请求,可能被再次匹配或者触发其他规则,形成无限循环。
解决办法
你需要把短URL规则放在Magento默认的index.php转发规则之前,并且添加条件排除目标路径的请求,避免重复匹配。
修改后的完整mod_rewrite代码块
<IfModule mod_rewrite.c> Options +FollowSymLinks RewriteEngine on # 新增的短URL跳转规则(放在这里,优先执行) RewriteCond %{REQUEST_URI} !^/cartroute/ RewriteRule ^-([a-zA-Z0-9]+)$ cartroute/cartlink?shortcode=$1 [L] RewriteRule ^api/rest api.php?type=rest [QSA,L] RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteCond %{REQUEST_METHOD} ^TRAC[EK] RewriteRule .* - [L,R=405] <IfModule mod_setenvif.c> <IfModule mod_headers.c> Header set X-Content-Type-Options: nosniff BrowserMatch \bMSIE\s8 ie8 Header set X-XSS-Protection: "1; mode=block" env=!ie8 </IfModule> </IfModule> RewriteCond %{REQUEST_URI} !^/(media|skin|js)/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_URI} !^/index.php/ RewriteRule .* index.php [L] </IfModule>
关键说明
- 规则位置:把短URL规则放在
RewriteEngine on之后、api规则之前,确保它优先被执行,在兜底规则处理之前就完成跳转。 - 排除条件:
RewriteCond %{REQUEST_URI} !^/cartroute/这条条件的作用是:如果请求已经是指向cartroute路径的,就不再匹配你的短URL规则,彻底避免循环。 - [L]标记:这个标记表示当前规则是最后一条,执行后就停止后续规则的处理,不过配合排除条件更稳妥,防止特殊场景下的重复触发。
备注:内容来源于stack exchange,提问作者John Doisneau
相关产品推荐
相关产品推荐

