使用子域通过 NGINX 将 HTTP 请求转发到特定端口违反了内容安全策略

Forward HTTP request through NGINX using subdomain to a specific port violates Content Security Policy

我想通过远程网络服务器公开本地网络服务器。远程主机已经有一个 Nginx 和一个 web 应用程序(webmail)。远程服务器用作将端口 80 转发到远程 8080 的本地网络服务器的网关。这是有效的。

现在我想将子域(例如bridge.mydomain.co)请求转发到转发端口。我试过使用这个:

server {
    listen 80;
    listen [::]:80;
    server_name bridge.mydomain.co;

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

本地网络服务器 运行 是一个复杂的 PHP 应用程序,因此它正在抱怨:

40 个错误,例如:

Refused to load the stylesheet '' because it violates the following Content Security Policy directive: "default-src https: data: 'unsafe-inline' 'unsafe-eval'". Note that 'style-src-elem' was not explicitly set, so 'default-src' is used as a fallback.

例如:( 不是 URL 不是 httpS 虽然错误是 )

Refused to load the image 'http://bridge.mydomain.co/core/img/favicon-touch.png' because it violates the following Content Security Policy directive: "default-src https: data: 'unsafe-inline' 'unsafe-eval'". Note that 'img-src' was not explicitly set, so 'default-src' is used as a fallback.

和 56 个:

Refused to load the script '' because it violates the following Content Security Policy directive: "default-src https: data: 'unsafe-inline' 'unsafe-eval'". Note that 'script-src-elem' was not explicitly set, so 'default-src' is used as a fallback.

我知道我可以直接公开转发的端口,这完美无缺。但是我想(最终)使用nginx来终止TLS然后转发。

阅读此问题似乎是 PHP 中的本地网络服务器拒绝了请求。然而,我不知道如何解决它。

有什么帮助吗?


更新

感谢@BrunoMirchevski,我注意到错误是指 HTTPS,但错误指向 HTTP URLs,所以不知道为什么那里会发生 HTTPS 错误。服务器可以在本地网络使用HTTP访问就好了。

如果您仔细阅读,该政策是关于 HTTPS 的使用的简单语言。 这里的问题是策略期望通过 HTTPS 加载内容,但您正在通过 non-SSL ( http ) 连接访问该网站。请为 443 创建一个虚拟主机,用 SSL 证书覆盖您的子域,然后尝试访问 HTTPS:// 版本。

如果您仍然遇到困难,我建议注册一个网络托管服务提供商并使用 low-cost 计划用于开发目的。 他们通常还可以帮助进行任何 SSL 配置和部署。您可以在这里查看一些好的主机:https://hostadvice.com/managed-hosting/

在最后搞清楚。感谢用户@user973254 的提示。我需要 pass/add 以下 headers:

server {
    listen 80;
    listen [::]:80;
    server_name bridge.mydomain.co;

    proxy_pass_header server;

    location / {
        proxy_set_header Host $host;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' http://bridge.mydomain.co http://bridge.mydomain.co:8080  http://bridge.mydomain.co/core/img/favicon-touch.png; img-src 'self' http://bridge.mydomain.co http://bridge.mydomain.co:8080;";
        proxy_pass http://bridge.mydomain.co:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

我认为不需要端口版本,并且缺少一些 headers “默认”涵盖的内容。所以还有改进的空间。

如果您想在这里阅读解释,material 来自比我知识渊博的人:How to Override Content-Security-Policy of Site A while using nginx proxy_pass on Site B for serving content?