.htaccess多路径404重定向时如何正确返回404 Not Found状态码
.htaccess多语言404规则返回正确状态码配置方法
问题本质
当前使用内部重写规则转发到404页面时,Apache会将这次请求识别为正常的页面访问,因此默认返回200 OK状态码,不符合HTTP规范要求。
推荐配置方案
优先使用Apache原生的404响应触发机制,不需要额外依赖模块,兼容性最好:
- 首先通过
ErrorDocument指令分别绑定默认和英文路径下的404页面 - 匹配到不存在的路径时,直接返回404状态码,Apache会自动加载对应路径下绑定的404页面,既保留现有多语言404展示逻辑,又能返回正确状态码
完整配置代码如下:
# 配置全局默认404页面 ErrorDocument 404 /error-404/ # 配置en-us路径下的专属404页面 # 注意:/var/www/html/en-us需要替换为你服务器上en-us目录对应的实际绝对路径 <Directory "/var/www/html/en-us"> ErrorDocument 404 /en-us/error-404/ </Directory> # 匹配en-us路径下不存在的文件/目录,直接触发404响应 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^/en-us/ RewriteRule ^ - [R=404,L] # 匹配其余路径下不存在的文件/目录,触发404响应 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ - [R=404,L]
配置说明:规则中
RewriteRule ^ -表示不修改请求路径,直接执行方括号内的标志操作;R=404标志会通知Apache直接返回404 Not Found状态码,同时自动调用对应路径预设的ErrorDocument页面输出内容。
备选方案(保留原有重写逻辑)
如果不想调整现有重写结构,可以通过mod_headers模块给重写后的请求强制打上404标记,配置如下:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^/en-us/ Rewriterule ^(.*) /en-us/error-404/ [L,E=SET_404:1] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d Rewriterule ^(.*) /error-404/ [L,E=SET_404:1] # 给标记为404的请求强制设置404状态码 Header always set Status 404 env=SET_404
注意:该方案需要服务器开启mod_headers模块,部分低配虚拟主机默认未开启该模块,兼容性弱于推荐方案。
验证方法
配置完成后不要直接用浏览器刷新测试(可能受本地缓存影响),推荐用命令行验证:
curl -I https://你的域名/不存在的测试路径 curl -I https://你的域名/en-us/不存在的测试路径
两条命令返回的响应头中包含HTTP/1.1 404 Not Found即为配置生效。
内容的提问来源于stack exchange,提问作者Vlad Stratulat
相关产品推荐
相关产品推荐

