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

使用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-luandk_http_module.so需要加载ngx_http_lua_module.so模块。

nginx -t最好也总是运行一个来验证您的配置。

相关内容