You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:48:11