.htaccess RewriteRule意外返回404问题求助
问题
现有.htaccess文件的Rewrite功能正常,但新增规则无法生效。新增规则为:RewriteRule ^(.*)/(webapps|gamedev|digitalart)$ $1/index.php [NC,PT,L]。完整Rewrite规则如下:
RewriteEngine on RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteRule ^(.*)/(webapps|gamedev|digitalart)$ $1/index.php [NC,PT,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [L]
该.htaccess位于https://dustinhendricks.com/test目录下,测试URLhttps://dustinhendricks.com/test/gamedev期望在不修改浏览器URL的情况下指向https://dustinhendricks.com/test/index.php,但实际返回404错误。在htaccess tester工具中测试该规则显示正常,请问故障原因是什么?
故障原因分析及解决方案
- 规则匹配逻辑错误:
.htaccess的Rewrite规则是基于当前目录的相对路径解析的,你的新增规则^(.*)/(webapps|gamedev|digitalart)$要求路径中必须包含斜杠,但测试URL/test/gamedev在test目录下的实际匹配路径是gamedev(而非test/gamedev),这条规则根本匹配不到目标请求。 - 后续规则干扰:即便规则匹配成功,最后一条规则
RewriteRule ^([^\.]+)$ $1.php [L]会尝试将gamedev重写为gamedev.php,该文件不存在就会触发404,但这是次要问题,核心还是新增规则的匹配逻辑错误。
修改后的规则
调整新增规则以匹配当前目录下的目标路径,修改后的.htaccess内容如下:
RewriteEngine on RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # 匹配当前目录下的webapps/gamedev/digitalart路径 RewriteRule ^(webapps|gamedev|digitalart)$ index.php [NC,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [L]
- 移除了规则中的
(.*)/部分,因为.htaccess在test目录下,请求路径gamedev就是相对当前目录的路径,无需匹配父目录结构。 - 保留
NC(忽略大小写)和L(终止后续规则)标志,去掉PT(传递给其他处理模块),此处不需要该标志。
修改后,访问https://dustinhendricks.com/test/gamedev会正确内部重写到test/index.php,不会返回404错误。
内容的提问来源于stack exchange,提问作者dqhendricks
相关产品推荐
相关产品推荐

