Наследование директив proxy_hide_header и proxy_pass_header

Maxim Dounin mdounin на mdounin.ru
Пн Июл 24 19:22:12 UTC 2023


Hello!

On Mon, Jul 24, 2023 at 06:42:14PM +0300, Gena Makhomed wrote:

> Здравствуйте, All!
> 
> Наследование директив proxy_hide_header и proxy_pass_header
> не работает ожидаемым образом, nginx 1.25.1
> конфиг:
> 
> http {
> 
>      proxy_pass_header Content-Disposition;
> 
>      server {
> 
>          server_name sentry.example.com;
> 
>          location / {
>              proxy_hide_header Content-Disposition;
>              proxy_pass http://172.17.110.100:9000;
>          }
>      }
> }
> 
> Директива proxy_hide_header не работает в такой конфигурации,
> - заголовок Content-Disposition присутствует в ответе сервера.
> 
> Если закомментировать директиву proxy_pass_header
>   на уровне http - только после этого начинает нормально
> работать директива proxy_hide_header на уровне location.
> 
> Это ошибка в коде nginx, что наследование не работает ожидаемым образом,
> или это ошибка в документации к nginx, что это явно не оговорено,
> или же это ошибка в моем понимании документации nginx?

Насколько я вижу, каких-либо специальных условий наследования для 
proxy_pass_header и proxy_hide_header в документации не указано.  
Соответственно, по общему правилу это два разных списка и они 
наследуются независимо:

- список заголовков, которые нужно спрятать, определяется 
  директивами proxy_hide_header; список наследуется с предыдущего 
  уровня, если на текущем уровне не определены директивы 
  proxy_hide_header.

- список спрятанных заголовков, которые тем не менее нужно 
  передать клиенту, определяется директивами proxy_pass_header;
  список наследуется с предыдущего уровня, если на текущем уровне 
  не определены директивы proxy_pass_header.

Наблюдаемое поведение, насколько я вижу, ожидаемому соответствует: 
в случае наличия заголовка в списке proxy_pass_header он 
передаётся клиенту, в случае отсутствия (и наличия в списке 
proxy_hide_header) - не передаётся.

> Задача у меня такая - надо включить заголовок Content-Disposition
> для всех сайтов, за исключением одного сайта - sentry self-hosted,
> для того чтобы обойти баг, который присутствует в браузере Safari.
> 
> Если я что-то делаю неправильно - как правильно решить эту задачу?
> 
> Подробнее об этом баге в браузере Safari и о workaround, для него:
> 
> https://github.com/getsentry/self-hosted/issues/2285#issuecomment-1647664859

Заголовок Content-Disposition отсутствует в proxy_hide_header по 
умолчанию, так что для решения данной задачи будет достаточно 
указать "proxy_hide_header Content-Disposition;" в конфигурации 
проксирования для Sentry.  Как, собственно, и предлагают по 
ссылке.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru