nginx passing back custom header

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

Solution 1:

You should use underscores_in_headers on directive which is off by default.

Solution 2:

You should use proxy_set_header for all headers you wish to forward to the backend servers. So instead of proxy_pass_header ... line:

proxy_set_header X_CUSTOM_HEADER $http_x_custom_header;

Solution 3:

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 add proxy_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.