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

您可能可以嘗試使用第 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

使用Nginx Lua 模組

您將需要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
  }
}

要驗證,請運行 a nginx -V,您將看到http-lua。需要ndk_http_module.so加載ngx_http_lua_module.so模組。

nginx -t最好也運行來驗證您的配置。

相關內容