.htaccess配置多条RewriteRule第二条无效返回404错误是什么原因?
规则失效核心原因
1. 前置条件逻辑错误
你写的RewriteCond %{REQUEST_FILENAME}\.php -f完全不符合当前业务场景:
当用户请求/hospital/xxx时,%{REQUEST_FILENAME}对应的是站点目录下的/hospital/xxx路径,拼接.php后变成/hospital/xxx.php,只有这个真实文件存在时才会触发后续重写。你的业务里不存在这类动态命名的文件,所以条件永远不生效。
之前blog规则能正常运行属于巧合:blog组的第二条重写规则没有前置条件限制,即使前面的条件不满足也能触发重写。
2. RewriteCond作用范围错误
RewriteCond仅对**紧随其后的第一条RewriteRule**生效,你每组规则下的第二条重写规则都没有对应的前置校验逻辑。
3. 规则冗余冲突
同前缀下你写了两条匹配逻辑高度重叠的规则,第一条加了[L]标记,匹配成功后会直接终止后续规则执行,第二条规则本身几乎没有生效机会。
4. 潜在的MultiViews干扰
如果Apache开启了MultiViews内容协商功能,会自动将/hospital/xxx路径解析为hospital.php,直接绕过你的重写规则。
修复后的完整.htaccess代码
RewriteEngine On # 关闭MultiViews避免内容协商干扰重写 Options -MultiViews # blog路由规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^blog/([^/.]+)$ /details.php?post=$1 [NC,QSA,L] # hospital路由规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^hospital/([^/.]+)$ /hospital-profile.php?v=$1 [NC,QSA,L]
验证注意事项
- 确认
hospital-profile.php文件存放在站点根目录,读取权限正常 - 确认Apache已开启
mod_rewrite模块,且站点配置中AllowOverride参数设置为All,允许.htaccess文件生效 - 测试时清空浏览器缓存或使用无痕模式,避免历史301永久重定向缓存干扰结果
内容的提问来源于stack exchange,提问作者Bearded
相关产品推荐
相关产品推荐

