通过 nginx 代理 http 错误时 http 标头消失

通过 nginx 代理 http 错误时 http 标头消失

我在 Apache 2.4 服务器前使用 nginx 作为 TLS 终止器。

add_header X-Content-Type-Options nosniff;在 nginx 中使用此标头添加到每个响应中。

如果 Apache 返回的 HTTP 状态代码低​​于 400,则表示标头设置正确,但如果状态大于或等于 400,则省略标头。

gzip 模块也是一样。如果状态代码低​​于 500,gzip 模块会自动压缩响应主体。但是如果 Apache 发出的 HTTP 状态代码大于或等于 500,gzip 模块就不会执行任何操作。

我的 nginx 配置的一些相关部分:

proxy_intercept_errors    off;
proxy_ignore_client_abort off;
proxy_http_version        1.1;
proxy_hide_header         X-Powered-By;
proxy_set_header          Connection  "";     #for keepalive to backend
add_header X-Content-Type-Options nosniff;

### gzip ###
gzip on;
gzip_min_length 20;     #default: 20
gzip_comp_level 9;
gzip_proxied any;
gzip_vary on;
gzip_types *;
gunzip on;

我可以做些什么来停用此行为并将我的标头添加到 HTTP 错误响应甚至 gzip HTTP 500 响应中?

答案1

今天我偶然发现了这里的 SSL 实验室线程中的解决方案: https://community.qualys.com/thread/17333-hsts-header-not-being-set-by-nginx-on-error

基本上,您必须alwaysadd_header配置选项中添加关键字。引用 nginx 文档 (http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header):

如果指定了always参数(1.7.5),那么无论响应代码如何,都会添加标头字段。

这很有帮助,现在每个响应(包括错误)的所有标头都按预期设置。

相关内容