.htaccess目录路径重定向至PHP脚本的异常问题排查
解决方案:修正.htaccess规则处理实际目录请求问题
核心问题出在Apache默认的目录尾部斜杠自动重定向行为和你的rewrite规则冲突,加上对实际目录的判断逻辑缺失。以下是调整后的完整.htaccess规则,完全适配你的需求:
# 开启重写引擎 RewriteEngine On # 关闭Apache默认的目录尾部斜杠自动重定向,避免干扰自定义规则 DirectorySlash Off # 移除请求路径的尾部斜杠(仅针对非文件请求) RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)/$ /$1 [L,R=301] # 优先级1:检查custom/public下是否存在请求文件,存在则直接返回 RewriteCond %{DOCUMENT_ROOT}/custom/public%{REQUEST_URI} -f RewriteRule ^(.*)$ /custom/public/$1 [L] # 优先级2:检查customizable/public下是否存在请求文件,存在则直接返回 RewriteCond %{DOCUMENT_ROOT}/customizable/public%{REQUEST_URI} -f RewriteRule ^(.*)$ /customizable/public/$1 [L] # 优先级3:检查template/public下是否存在请求文件,存在则直接返回 RewriteCond %{DOCUMENT_ROOT}/template/public%{REQUEST_URI} -f RewriteRule ^(.*)$ /template/public/$1 [L] # 其他所有情况(包括实际存在的目录、不在public子目录的路径)转发到virtualpath.php RewriteRule ^(.*)$ /virtualpath.php?path=$1 [L,QSA]
关键调整说明:
DirectorySlash Off:这是解决你问题的核心。Apache默认会自动给存在的目录添加尾部斜杠并触发重定向,这个行为会打乱你的rewrite规则执行顺序,导致实际目录请求被错误带上path参数。关闭后完全由自定义规则控制斜杠处理。- 尾部斜杠移除规则:添加了
%{REQUEST_FILENAME} !-f条件,确保只移除非文件路径的尾部斜杠,避免对带斜杠的无效文件请求做多余处理。 - 文件存在检查顺序:按
custom > customizable > template的优先级判断,符合自定义内容覆盖默认模板的逻辑。 QSA标志:在最后转发规则中添加该标志,保留原请求的查询参数(如果有的话),增强规则的健壮性。
测试注意事项:
- 测试前务必清除浏览器缓存,因为301重定向会被浏览器持久缓存,可能导致旧规则的效果残留。
- 可以继续用
LogLevel alert rewrite:trace8查看日志,现在规则逻辑清晰,能更容易定位执行流程。
内容的提问来源于stack exchange,提问作者RobinLe
相关产品推荐
相关产品推荐

