在站点 B 上使用 nginx proxy_pass 来提供内容时,如何覆盖站点 A 的内容安全策略?

4 security proxy nginx content-security-policy

当我在站点 B 上使用 nginx proxy_pass 时,有没有办法覆盖域/站点 A 设置的内容安全策略。

Site A defined Content-Security-Policy on their domain.
Site B acts as a reverse proxy for site A.
Run Code Online (Sandbox Code Playgroud)

在从站点 B 提供内容时如何覆盖 Content-Security-Policy ?

我如何在 nginx 代理传递中实现这一点?

我当前的 nginx 服务器块看起来像这样

server {
server_name  proxy-domain.com.;

    location / {
      proxy_pass http://www.target-site.com/;
      proxy_set_header  Accept-Encoding ""; 
      proxy_set_header  X-Real-IP   $remote_addr;   
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}
Run Code Online (Sandbox Code Playgroud)

我试过添加

add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'

例如

server {
server_name  proxy-domain.com.;

    location / {
      proxy_pass http://www.target-site.com/;
      proxy_set_header  Accept-Encoding ""; 
      proxy_set_header  X-Real-IP   $remote_addr;   
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
   }
add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'
}
Run Code Online (Sandbox Code Playgroud)

但是如果我检查站点 B 的标题,那么它会显示站点 B 的修改后的 Content-Security-Policy,但是来自其他来源的内容没有被加载。,只设置了标题。

这是为什么 ?

更新:当我检查标头时,我得到 2 个 Content-Security-Policy 标头,首先由站点 A 设置,然后将一个 Content-Security-Policy 标头设置为我的 ie 站点 B。

例如

Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval' apis.google.com www.google.com;
Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval' *.cloudflare.com;
Run Code Online (Sandbox Code Playgroud)

Kev*_*son 5

这个问题似乎类似于Nginx 作为反向代理,删除Nginx 邮件列表上的X-Frame-Options 头线程。该解决方案是proxy_hide_header

默认情况下,nginx 不会将头字段“Date”、“Server”、“X-Pad”和“X-Accel-...”从代理服务器的响应传递给客户端。proxy_hide_header 指令设置不会传递的附加字段。相反,如果需要允许传递字段,则可以使用 proxy_pass_header 指令。