I have the following example
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;
}
Now when i use the following curl line
curl --head -H "X_CUSTOM_HEADER: foo" http://domain.com/api/test
Now that does not work.. the apache/php on the backend doesn't see the header. If I bypass nginx it works
curl --head -H "X_CUSTOM_HEADER: foo" http://web1.domain.com/api/test
You should use
underscores_in_headers on
directive which is off by default.You should use
proxy_set_header
for all headers you wish to forward to the backend servers. So instead ofproxy_pass_header ...
line:The above didn't work for me either so I used
proxy_pass_header
. See the Nginx Wiki about proxy_pass_header here.If your custom header is
device_id
addproxy_pass_header device_id;
to your Proxy block.If you are using customheaders with an underscore in it (like I am) be sure to make sure you have
underscores_in_headers on
in your Nginx Config.By default the nginx forwards all the ( proxy_pass_request_headers on;) the header to the backend server. But if your request header ( may be custom header) includes underscore ( _ ) in the header name then nginx blocks those headers.
To enable Nginx to pass all or the custom requested header to the backend turn on the underscore option on.