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
相关产品推荐
相关产品推荐

