nginx传回自定义标头


13

我有下面的例子

           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

Answers:



2

您应该使用proxy_set_header所有要转发到后端服务器的标头。因此,而不是proxy_pass_header ...行:

proxy_set_header X_CUSTOM_HEADER $http_x_custom_header;

我已经尝试过了,但是它没有正确设置标题,如果我将$ http_x_custom_header替换为“ foo”,它将起作用
Mike

我不确定为什么它不适用于@Mike,但是对我有用。我正在将X-Forwarded-Proto与$ http_x_forwarded_proto一起使用。
Tyler Collier 2014年

2

上面的方法对我也不起作用,所以我用了proxy_pass_header。在此处查看有关proxy_pass_headerNginx Wiki

如果您的自定义标头已device_id添加proxy_pass_header device_id;到代理块中。

如果您使用带有下划线的customheader(例如我),请确保您已underscores_in_headers on在Nginx Config中使用它。


非常感谢 !我正在拔头发....您的帖子使我放松了...
Fahad Ahammed

1

默认情况下,nginx将所有(proxy_pass_request_headers on;)标头转发到后端服务器。但是,如果您的请求标头(可能是自定义标头)在标头名称中包含下划线(_),则nginx会阻止这些标头。

Ex: authenticate_type, cdn_enable.

要使Nginx将全部或自定义请求的标头传递给后端,请打开下划线选项。

underscores_in_headers on;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.