.htaccess RewriteRule异常:带城市名的URL重定向至根域名问题求助
URL重定向问题解决方案
问题场景
网站使用两种URL结构:
- 带分类:
example.com/CATEGORY/CITYNAME/TITLE/ID/ - 无分类:
example.com/CITY/TITLE/ID/
现有.htaccess规则可正常处理上述两种job页面URL:
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)?$ page.php?jobid=$3 RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)?$ page.php?jobid=$4
分类页面(如warehouse-jobs)配置了自动补全城市名的规则:
RewriteRule ^warehouse-jobs$ catpage.php?id=10&kw=Warehouse&base=warehouse-jobs [L,NC] RewriteRule ^.+/([^/]*)/$ catpage.php?id=10&kw=Warehouse&base=warehouse-jobs&loc=$1 [L]
不带城市名的example.com/warehouse-jobs可正常跳转,但带城市名的example.com/warehouse-jobs/Chicago/会莫名重定向到域名根目录。
问题原因
- 规则顺序错误:job规则在分类规则之前,带城市的分类URL会先被job规则匹配(比如
warehouse-jobs/Chicago/会被第一条job规则匹配为$1=warehouse-jobs、$2=Chicago、$3=,导致page.php接收空的jobid,进而触发重定向)。 - 正则过于宽泛:第二条分类规则的
^.+/([^/]*)/$会匹配任意带末尾斜杠的两级路径,包括job页面的URL,导致规则冲突。
修复方案
1. 调整规则顺序
将分类相关规则放在job规则之前,确保更具体的分类URL先被匹配。
2. 优化分类规则的正则
把第二条分类规则的宽泛正则改为精准匹配warehouse-jobs/城市名/的格式,避免误匹配其他URL。
修改后的完整.htaccess代码
# 分类页面规则 - 放在最前面 RewriteRule ^warehouse-jobs$ catpage.php?id=10&kw=Warehouse&base=warehouse-jobs [L,NC] RewriteRule ^warehouse-jobs/([^/]+)/$ catpage.php?id=10&kw=Warehouse&base=warehouse-jobs&loc=$1 [L,NC] # Job页面规则 RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)?$ page.php?jobid=$3 [L] RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)?$ page.php?jobid=$4 [L]
额外检查
- 确保服务器开启了
mod_rewrite模块。 - 如果网站开启了
DirectorySlash On(默认开启),可在规则中统一处理末尾斜杠,或者添加规则统一URL格式,避免重复重定向。
内容的提问来源于stack exchange,提问作者Complete Noob
相关产品推荐
相关产品推荐

