.htaccess重写规则配置求助:无法实现目标URL伪静态转换
解决.htaccess URL重写的问题
嘿,我看你在配置URL重写的时候卡壳了,咱们一步步来搞定你的需求。先明确你要实现的两个核心目标:
- 让
http://domainname.com/eatry实际指向http://domainname.com/sub-category.php?mc=eatry - 让
http://domainname.com/eatry/restaurant实际指向http://domainname.com/explorelisting.php?mc=eatry&sc=restaurant
先说说你现有代码里的几个问题:
.htaccess里的RewriteRule匹配路径时不需要开头的/,服务器会自动去掉当前目录的前缀- 前两条规则用了完全一样的匹配模式
^/(.*),这会导致第一条规则先触发,第二条永远不会被执行 - 第二条规则里的
sc=$1是错误的,你需要捕获第二个路径段作为sc的值,而不是重复用第一个捕获组 - 最后的
.php重写规则会和你的URL美化规则冲突,它会把eatry直接转成eatry.php,而不是你想要的sub-category.php
下面是修正后的完整代码,我会逐条解释:
RewriteEngine On # 处理带二级分类的URL:domain.com/eatry/restaurant -> explorelisting.php?mc=eatry&sc=restaurant RewriteRule ^([^/]+)/([^/]+)$ explorelisting.php?mc=$1&sc=$2 [L,NC] # 处理只有一级分类的URL:domain.com/eatry -> sub-category.php?mc=eatry RewriteRule ^([^/]+)$ sub-category.php?mc=$1 [L,NC] # 处理直接访问.php文件的简写(比如 domain.com/about -> about.php),同时避免和上面的重写冲突 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^\.]+)$ $1.php [NC,L]
规则细节解释:
- 第一条规则:匹配包含两个路径段的URL(比如
eatry/restaurant),([^/]+)捕获任意不包含/的字符作为分组,第一个分组$1对应mc参数,第二个分组$2对应sc参数。[L]标记表示这是最后一条要执行的规则,匹配后停止处理后续规则;[NC]表示不区分大小写。 - 第二条规则:匹配只有一个路径段的URL(比如
eatry),捕获这个路径段作为mc参数,同样用[L,NC]确保优先级。 - 第三条规则:先通过
RewriteCond判断请求的不是真实存在的文件(!-f)和目录(!-d),再把请求转成对应的.php文件。这样就不会和前面的分类URL重写冲突,因为eatry不是真实文件/目录,但前面的规则已经先处理了它。
额外注意事项:
- 确保你的服务器已经开启了
mod_rewrite模块 - 网站根目录的
AllowOverride设置为All,这样.htaccess的规则才能生效 - 测试时可以清空浏览器缓存,避免旧的URL缓存影响结果
内容的提问来源于stack exchange,提问作者Rahul Raghav




