我有一个 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
使用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
}
}
要验证,请运行nginx -V
,您将看到http-lua
。ndk_http_module.so
需要加载ngx_http_lua_module.so
模块。
nginx -t
最好也总是运行一个来验证您的配置。