У меня есть настройка прокси Nginx, где я добавляю несколько заголовков, связанных с безопасностью, на сервер, чтобы они возвращались во всех расположениях прокси. В некоторых расположениях мне нужно добавить дополнительные заголовки (например, Content-Security-Policy
to /
), в то время как в других определенных расположениях мне нужно удалить один из заголовков (например, X-Frame-Options
from /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
ответа о местоположении?
решение1
Атрибуты конфигурации заголовка немного запутанны, вот что они делают:
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;
решение2
Вы можете использовать модуль headers_more. Пример:
location / {
proxy_pass http://upstream_server/;
more_clear_headers 'Access-Control-Allow-Origin';
}
решение3
Вероятно, вы могли бы попробовать использовать сторонний модуль «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';
...
}
решение4
ИспользуяМодуль Lua Nginx.
Вам понадобится nginx-extras
установленный пакет. Например, в aptitude сделайте 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
чтобы проверить вашу конфигурацию.