Наследование директив 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