我有一個 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
您可能可以嘗試使用第 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
最好也運行來驗證您的配置。