.htaccess配置URL重写返回404而非加载index.php问题求助
故障触发原因
- 重写规则的目标路径未指定根路径,会被Apache解析为当前请求路径下的相对路径:请求
/es/index.php时,现有规则输出的$2?idioma=$1会被解析为/es/index.php?idioma=es,该实体文件不存在直接触发404。 - 参数名不匹配:需求是传递
lengua参数,但现有规则写的是idioma,即使规则生效参数也不符合预期。 - 规则和
FallbackResource指令存在冲突:二者同时配置时会优先触发重写规则的路径校验,未匹配到文件时不会触发FallbackResource兜底。 - 可能存在服务器配置问题:未开启站点的
AllowOverride All权限,导致.htaccess文件未被加载。
排查步骤
- 确认Apache站点对应虚拟主机的
AllowOverride参数是否设置为All,修改后需重启Apache服务生效。 - 开启Apache的rewrite日志:在虚拟主机配置中加入
LogLevel alert rewrite:trace3,重启后访问目标地址,查看日志中的重写执行流程,确认规则是否被加载、执行路径是否符合预期。 - 临时注释
FallbackResource配置,测试重写规则是否能正常执行。
修复后的.htaccess配置
<FilesMatch ".*\.(log|ini|htaccess)$"> deny from all </FilesMatch> Options -Indexes RewriteEngine On RewriteBase / # 过滤已存在的实体文件/目录,避免重写影响静态资源 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 目标路径前加/强制指定根路径,参数名修改为lengua RewriteRule ^(en|es|pt)?/?(.*)?$ /$2?lengua=$1 [QSA,L] FallbackResource "index.php"
修改说明
- 目标路径前添加
/,强制解析为根目录下的文件,避免相对路径问题 - 参数名从
idioma改为需求的lengua - 新增
RewriteCond排除已存在的实体文件、目录,避免静态资源(css/js/图片)被重写规则影响 - 保留
FallbackResource作为兜底,未匹配到重写规则的请求会自动指向index.php
内容的提问来源于stack exchange,提问作者Saleck
相关产品推荐
相关产品推荐

