使用子域通过 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?
我想通过远程网络服务器公开本地网络服务器。远程主机已经有一个 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?