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
Майк
источник

Ответы:

15

Вы должны использовать underscores_in_headers onдирективу, которая по умолчанию отключена.

AlexD
источник
Эта информация экономит мои часы.
Морган Ченг
Я бы с удовольствием купил вам освежающий напиток.
ballmw
Вы, сэр, ученый и джентльмен.
Ева Фриман
2

Вы должны использовать proxy_set_headerвсе заголовки, которые вы хотите перенаправить на серверы. Итак, вместо proxy_pass_header ...строки:

proxy_set_header X_CUSTOM_HEADER $http_x_custom_header;
Микко
источник
Я пробовал это, и он не устанавливает заголовок правильно. Если я заменим $ http_x_custom_header на «foo», это сработает
Майк
Я не уверен, почему это не сработало для @Mike, но оно сработало для меня. Я использую X-Forwarded-Proto с $ http_x_forwarded_proto.
Тайлер Кольер
2

Вышеупомянутое не работает для меня, так что я использовал proxy_pass_header. Смотрите Nginx Wiki о proxy_pass_header здесь .

Если ваш пользовательский заголовок device_idдобавлен proxy_pass_header device_id;в ваш прокси-блок.

Если вы используете пользовательские заголовки с подчеркиванием (как и я), убедитесь, что вы указали их underscores_in_headers onв своей конфигурации Nginx.

user2700022
источник
Большое спасибо ! Я вырывал свои волосы ... Ваш пост меня успокоил ...
Фахад Ахаммед
1

По умолчанию nginx перенаправляет все заголовки ( proxy_pass_request_headers on; ) на внутренний сервер. Но если ваш заголовок запроса (может быть настраиваемым заголовком) содержит подчеркивание (_) в имени заголовка, тогда nginx блокирует эти заголовки.

Ex: authenticate_type, cdn_enable.

Чтобы разрешить Nginx передавать весь или пользовательский запрошенный заголовок в бэкэнд, включите опцию подчеркивания.

underscores_in_headers on;
GangaRam Dewasi
источник