我有以下示例
location / {
proxy_read_timeout 2000;
proxy_next_upstream error;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass_header X_CUSTOM_HEADER;
proxy_redirect off;
proxy_max_temp_file_size 0;
proxy_pass https://prod;
break;
}
现在当我使用以下卷曲线
curl --head -H "X_CUSTOM_HEADER: foo" http://domain.com/api/test
现在不起作用了。后端的 apache/php 看不到标头。如果我绕过 nginx,它就可以工作
curl --head -H "X_CUSTOM_HEADER: foo" http://web1.domain.com/api/test
答案1
你应该使用underscores_in_headers on
默认情况下,该指令处于关闭状态。
答案2
您应该proxy_set_header
对所有希望转发到后端服务器的标头使用。因此,不要使用proxy_pass_header ...
以下行:
proxy_set_header X_CUSTOM_HEADER $http_x_custom_header;
答案3
上面的方法对我来说也不起作用,所以我使用了proxy_pass_header
。请参阅 Nginx Wiki 关于 proxy_pass_header 的信息请见此处。
如果您的自定义标题被device_id
添加proxy_pass_header device_id;
到您的代理块。
如果您使用带有下划线的 customheaders (就像我一样),请确保您underscores_in_headers on
的 Nginx 配置中已有此信息。
答案4
默认情况下,nginx 转发所有(proxy_pass_request_headers 开启;) 标头到后端服务器。但是,如果您的请求标头(可能是自定义标头)在标头名称中包含下划线 ( _ ),则 nginx 会阻止这些标头。
Ex: authenticate_type, cdn_enable.
要使 Nginx 能够将所有或自定义请求的标头传递到后端,请打开下划线选项。
underscores_in_headers on;