OpenCart中两条RewriteRule无法同时生效的问题求助
解决OpenCart中两条RewriteRule共存问题
问题场景
需要为以下两个URL配置独立的Rewrite规则:
http://localhost/cartz/mycity/http://localhost/cartz/
当前配置的规则如下:
RewriteRule ^([^?]*)/([^?]*) index.php?city=$1&_route_=$2 [L,QSA] # Point 1 RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] # Point 2
当前问题:注释第一条规则时,第二条URL可正常工作,但两条规则同时启用时无法共存。补充说明:OpenCart内部会将_route_参数处理为route。
问题原因
第一条规则的正则表达式^([^?]*)/([^?]*)匹配范围过宽,会覆盖所有包含斜杠的路径(包括根路径的隐含匹配),导致第二条规则永远无法触发。
解决方案
调整正则表达式,让两条规则的匹配范围明确区分:
修改后的规则
# 匹配带城市标识的路径(如 /mycity/ 或 /mycity/xxx) RewriteRule ^([^/]+)/?(.*)$ index.php?city=$1&_route_=$2 [L,QSA] # 匹配根路径或单级路由路径 RewriteRule ^(.*)$ index.php?_route_=$1 [L,QSA]
更精准的拆分(可选)
如果需要严格匹配根路径和单级路由,可以拆分为两条规则:
# 匹配带城市标识的路径 RewriteRule ^([^/]+)/?(.*)$ index.php?city=$1&_route_=$2 [L,QSA] # 匹配根路径(空路径) RewriteRule ^$ index.php?_route_= [L,QSA] # 匹配单级路由路径 RewriteRule ^([^/]+)$ index.php?_route_=$1 [L,QSA]
额外注意事项
确保在.htaccess文件开头设置正确的RewriteBase,适配你的OpenCart目录:
RewriteBase /cartz/
规则说明
- 第一条规则的
^([^/]+)/?(.*)$确保匹配至少包含一个非斜杠的城市段,后面可跟任意路径(包括空),不会触发根路径的匹配。 - 第二条规则处理根路径和未包含城市段的单级路径,保证两条规则的匹配范围无重叠。
内容的提问来源于stack exchange,提问作者Prabhakaran
相关产品推荐
相关产品推荐

