You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP项目.htaccess RewriteRule模板化后404及URL重定向问题求助

原配置错误原因

  1. 正则量词缺失:你编写的通用规则里([a-z-])仅匹配单个字符,无法匹配add-news这类多字符路径,需要添加量词+改为([a-z-]+)
  2. 字符映射缺失:美化URL用的连字符-和实际PHP文件的下划线_没有做转换,直接拼接路径会找不到对应文件
  3. 规则顺序错误:自定义重写规则要放在通用补.php后缀规则前面,否则通用规则会优先触发,导致自定义规则不执行
  4. 重定向逻辑缺失:没有处理旧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实现任意数量的字符转换:

  1. 打开Apache的httpd.conf配置文件,添加以下规则后重启Apache:
RewriteMap underscoreToHyphen "sed:s/_/-/g"
RewriteMap hyphenToUnderscore "sed:s/-/_/g"
  1. 替换.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:45:07