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

htaccess RewriteRule异常:访问多级路径触发父级脚本运行问题排查

好的,让我们来排查一下你遇到的问题。当你访问像website.be/festivalName/eventName这样的多级路径时,却触发了父级路径对应的脚本,这大概率是因为规则匹配逻辑或服务器配置存在几个小问题,我来帮你逐一解决:

1. 先禁用MultiViews选项

Apache的MultiViews功能经常会干扰mod_rewrite的规则匹配。开启这个功能时,Apache会自动尝试寻找与请求路径同名的文件(比如把/festivalName映射到/festivalName.php),直接绕过你的rewrite规则。你可以在.htaccess最顶部添加这一行来禁用它:

Options -MultiViews

2. 修正查询字符串的分隔符

你当前的RewriteRule中使用了&作为参数分隔符,这是HTML转义字符,但在Apache配置里应该直接用&。虽然这不会导致规则不匹配,但会让PHP接收到错误的参数名(比如amp;festival而不是festival),所以需要把所有&替换成&。

3. 让规则兼容结尾斜杠

如果用户访问路径时带了结尾斜杠(比如website.be/festivalName/eventName/),你当前的正则表达式^([^/]+)/([^/]+)$会匹配失败——因为正则要求路径正好是两段且没有结尾斜杠。可以在正则末尾添加/?,这样不管有没有结尾斜杠都能匹配。

修改后的完整配置

RewriteEngine on
Options -MultiViews

# 匹配三级路径(支持带/或不带/)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ views/festivals/index.view.php?organisation=$1&festival=$2&event=$3 [L]

# 匹配二级路径(支持带/或不带/)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ views/festivals/index.view.php?organisation=$1&festival=$2 [L]

# 匹配一级路径(支持带/或不带/)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ views/organisations/index.view.php?organisation=$1 [L]

额外检查点

如果服务器上存在与路径段同名的真实目录(比如/festivalName是实际存在的目录),mod_dir的DirectorySlash功能会自动重定向到带斜杠的路径,这也可能干扰规则匹配。上面的配置已经兼容了带斜杠的路径,所以不用额外处理;如果不需要这些目录,直接删除即可。

内容的提问来源于stack exchange,提问作者Bert Hemelsoen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:02:10