Назад | Перейти на главную страницу

Как удалить добавленный сервером заголовок из проксируемого местоположения?

У меня есть настройка прокси-сервера Nginx, в которой я добавляю на сервер несколько заголовков, связанных с безопасностью, чтобы они возвращались во все местоположения прокси. В некоторых местах мне нужно добавить дополнительные заголовки (например, Content-Security-Policy к /), а в других конкретных местах мне нужно удалить один из заголовков (например, X-Frame-Options из /framepage.html) добавлен на уровне сервера.

nginx.conf

# ...

server {
  # ...

  include security-headers.conf;

  location / {
    proxy_pass http://web:5000/;
    include security-headers.conf;
    add_header Content-Security-Policy "my csp...";
  }

  location = /framepage.html {
    proxy_pass http://web:5000/framepage.html;
    # TODO: remove `X-Frame-Options` response header from this specific page
    # Tried add_header X-Frame-Options "";
    # Tried proxy_set_header X-Frame-Options "";
    # Tried proxy_hide_header X-Frame-Options;
  }

  location /api/ {
    proxy_pass http://api:5000/;
  }

  location /otherstuff/ {
    proxy_pass http://otherstuff:5000/;
  }

  # ...
}

security-headers.conf

add_header Referrer-Policy same-origin;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

Я пробовал следующее, но ни один из них, похоже, не удаляет X-Frame-Options заголовок из /framepage.html ответ местоположения:

Как я могу удалить X-Frame-Options заголовок из /framepage.html ответ местоположения?

Атрибуты конфигурации заголовка немного сбивают с толку, вот что они делают:

proxy_set_header установить заголовок запроса
add_header добавить заголовок к ответу
proxy_hide_header скрыть заголовок ответа

Если вы хотите заменить заголовок, который уже существует в ответе, этого недостаточно с add_header потому что он будет складывать значения (с сервера и с того, который вы добавили).

Вы должны сделать это в два этапа:

1) удалить заголовок:
proxy_hide_header Access-Control-Allow-Origin;

2) добавьте собственное значение заголовка:
add_header Access-Control-Allow-Origin "*" always;

Вы можете использовать модуль headers_more. Пример:

location / {
    proxy_pass http://upstream_server/;
    more_clear_headers 'Access-Control-Allow-Origin';
}

https://www.nginx.com/resources/wiki/modules/headers_more/

Возможно, вы могли бы попробовать использовать сторонний модуль «Headers More»:

https://github.com/openresty/headers-more-nginx-module

И что-то вроде:

load_module modules/ngx_http_headers_more_filter_module.so;

http {
    ...
    more_clear_headers 'X-Frame-Options';
    ...
}

Не надо include security-headers.conf на server уровень. Только include это в каждом человеке location куда вы хотите отправлять эти заголовки.

Причина в том, что add_header директивы наследуются от предыдущего уровня тогда и только тогда, когда на текущем уровне нет add_header директивы. Таким образом, вы включаете их в server блок заставляет их быть включенными в каждый location поскольку вы не отменяете их ни в одном location.

Используя Модуль Nginx Lua.

Вам понадобится nginx-extras пакет установлен. Например, в способности сделать apt install nginx-extras.

В nginx.conf:

load_module /usr/lib/nginx/modules/ndk_http_module.so;
load_module /usr/lib/nginx/modules/ngx_http_lua_module.so;

http {
  ...

  header_filter_by_lua_block {
    ngx.header["server"] = nil
  }
}

Чтобы проверить, запустите nginx -V и ты увидишь http-lua. В ndk_http_module.so необходимо для загрузки ngx_http_lua_module.so модуль.

Всегда лучше запустить nginx -t также для проверки вашей конфигурации.