nginx 传回自定义标头

nginx 传回自定义标头

我有以下示例

           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;

相关内容