16

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
Mike
  • 22,310
  • 7
  • 56
  • 79

4 Answers4

18

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

AlexD
  • 8,747
  • 2
  • 29
  • 38
3

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;
Mikko
  • 955
  • 8
  • 14
  • I have tried that and it doesn't set the header correctly, If i replace $http_x_custom_header with "foo" it works – Mike Aug 03 '11 at 21:23
  • I'm not sure why it didn't work for @Mike but it did work for me. I am using X-Forwarded-Proto with $http_x_forwarded_proto. – Tyler Collier Jul 09 '14 at 21:43
2

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.

Ex: authenticate_type, cdn_enable.

To enable Nginx to pass all or the custom requested header to the backend turn on the underscore option on.

underscores_in_headers on;
GangaRam Dewasi
  • 191
  • 1
  • 1
2

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.

user2700022
  • 121
  • 1
  • 4