PHP项目.htaccess RewriteRule模板化后404及URL重定向问题求助
原配置错误原因
- 正则量词缺失:你编写的通用规则里
([a-z-])仅匹配单个字符,无法匹配add-news这类多字符路径,需要添加量词+改为([a-z-]+) - 字符映射缺失:美化URL用的连字符
-和实际PHP文件的下划线_没有做转换,直接拼接路径会找不到对应文件 - 规则顺序错误:自定义重写规则要放在通用补
.php后缀规则前面,否则通用规则会优先触发,导致自定义规则不执行 - 重定向逻辑缺失:没有处理旧PHP路径跳转到美化URL、参数拼接跳转的逻辑
修复后完整配置(适用于单下划线文件名场景,无需修改Apache核心配置)
如果你的admin目录下PHP文件都是类似xxx_xxx的单下划线命名格式,直接用以下配置即可:
RewriteEngine On RewriteBase / # ---------------重定向规则:旧路径跳转美化URL--------------- # 带参数的PHP文件跳转:admin/edit_news.php?name=xxx&id=xxx → admin/edit-news/xxx/xxx RewriteCond %{QUERY_STRING} ^name=([0-9a-z-@._]+)&id=([0-9]+)$ RewriteRule ^admin/([a-z]+)_([a-z]+)\.php$ /admin/$1-$2/%1/%2? [R=302,L] # 不带参数的PHP文件跳转:admin/add_news.php → admin/add-news RewriteRule ^admin/([a-z]+)_([a-z]+)\.php$ /admin/$1-$2 [R=302,L] # ---------------内部重写规则:美化URL映射到实际文件--------------- # 带参数的通用规则:admin/edit-news/xxx/xxx → admin/edit_news.php?name=xxx&id=xxx RewriteRule ^admin/([a-z]+)-([a-z]+)/([0-9a-z-@._]+)/([0-9]+)/?$ admin/$1_$2.php?name=$3&id=$4 [L] # 不带参数的通用规则:admin/add-news → admin/add_news.php RewriteRule ^admin/([a-z]+)-([a-z]+)/?$ admin/$1_$2.php [L] # ---------------原有通用PHP后缀补全规则--------------- RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L]
多下划线文件名通用解决方案(需修改Apache配置)
如果需要支持add_news_detail这类多下划线文件名(对应美化URLadd-news-detail),可以配置RewriteMap实现任意数量的字符转换:
- 打开Apache的
httpd.conf配置文件,添加以下规则后重启Apache:
RewriteMap underscoreToHyphen "sed:s/_/-/g" RewriteMap hyphenToUnderscore "sed:s/-/_/g"
- 替换
.htaccess里的重定向、重写规则为通用版本:
# 带参数旧路径跳转 RewriteCond %{QUERY_STRING} ^name=([0-9a-z-@._]+)&id=([0-9]+)$ RewriteRule ^admin/([a-z_]+)\.php$ /admin/${underscoreToHyphen:$1}/%1/%2? [R=302,L] # 不带参数旧路径跳转 RewriteRule ^admin/([a-z_]+)\.php$ /admin/${underscoreToHyphen:$1} [R=302,L] # 带参数内部重写 RewriteRule ^admin/([a-z-]+)/([0-9a-z-@._]+)/([0-9]+)/?$ admin/${hyphenToUnderscore:$1}.php?name=$2&id=$3 [L] # 不带参数内部重写 RewriteRule ^admin/([a-z-]+)/?$ admin/${hyphenToUnderscore:$1}.php [L]
测试注意事项
- 先使用
R=302临时重定向测试,确认所有跳转正常后再改为R=301永久重定向,避免浏览器缓存错误的重定向规则 - 确保WAMP的Apache配置中已经开启
rewrite_module,且虚拟主机配置里AllowOverride All已开启 - 测试前清除浏览器缓存,或使用无痕模式测试
内容的提问来源于stack exchange,提问作者Hunter91151
相关产品推荐
相关产品推荐

