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

NGINX使用SSI include时$status变量返回值异常技术问询

NGINX SSI中$status始终返回200的解决方案

问题原因

这是因为NGINX处理error_page时会发起内部子请求获取错误页面文件,此时$status变量默认指向的是这个子请求的状态码(200,因为成功读取了静态文件),而非原始请求的错误状态码。其他变量(如$request_id)属于全局请求上下文,因此不受子请求影响。

解决方案

方案1:传递原始状态码作为URL参数(兼容所有NGINX版本)

修改error_page配置,将原始状态码通过URL参数传递给错误页面:

error_page 502 503 504 /errorpages/503.html?orig_status=$status;
error_page 401 403 /errorpages/403.html?orig_status=$status;

location /errorpages/ {
    ssi on;
    root /var/www/;
    # 可选:隐藏URL中的参数,避免暴露给客户端
    if ($args ~* "orig_status=(\d+)") {
        set $orig_status $1;
        rewrite ^(.*)$ $1? break;
    }
}

同步修改map配置,基于传递的原始状态码映射文本:

map $orig_status $status_text {
    200 'OK';
    403 'Forbidden';
    503 'Service Unavailable';
    # 补充其他需要的状态码映射
}

最后更新footer.html中的SSI指令:

HTTP details: <!--# echo var="orig_status" default="" --> <!--# echo var="status_text" default="" -->

方案2:使用$sent_status变量(NGINX >= 1.17.0)

如果你的NGINX版本在1.17.0及以上,可直接使用$sent_status变量——它代表最终发送给客户端的响应状态码,不受内部子请求的状态影响。

修改map配置:

map $sent_status $status_text {
    200 'OK';
    403 'Forbidden';
    503 'Service Unavailable';
    # 补充其他需要的状态码映射
}

更新footer.html:

HTTP details: <!--# echo var="sent_status" default="" --> <!--# echo var="status_text" default="" -->

这种方式无需调整error_page配置,实现更简洁。

内容的提问来源于stack exchange,提问作者S1LV3R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:23:12