У меня есть настройка прокси-сервера 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
ответ местоположения:
add_header X-Frame-Options "";
proxy_set_header X-Frame-Options "";
proxy_hide_header X-Frame-Options;
Как я могу удалить 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';
}
Возможно, вы могли бы попробовать использовать сторонний модуль «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
также для проверки вашей конфигурации.