nginx.conf

nginx.conf

У меня есть настройка прокси Nginx, где я добавляю несколько заголовков, связанных с безопасностью, на сервер, чтобы они возвращались во всех расположениях прокси. В некоторых расположениях мне нужно добавить дополнительные заголовки (например, Content-Security-Policyto /), в то время как в других определенных расположениях мне нужно удалить один из заголовков (например, X-Frame-Optionsfrom /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';
}

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

решение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чтобы проверить вашу конфигурацию.

Связанный контент