如何解决nginx反向代理混合内容(http,https)

如何解决nginx反向代理混合内容(http,https)

刚接触 nginx。玩了两天,还是不知道该如何解决这个问题:

我在一个盒子里运行了一堆虚拟机,这个盒子显然在我的路由器后面,其中一个虚拟机正在运行 nginx(我的反向代理)并且设置为 DMZ。

我已经在该虚拟机上正确安装了 SSL 证书,现在我希望所有传入流量都按照其路径进行定向,例如:

domain.com/service1->192.168.1.101

domain.com/service2->192.168.1.102

等等。想法是让 nginx 充当 SSL 层,然后 nginx 通过 HTTP 或任何未加密的协议与其他 VM 通信。然后,当然,当 nginx 与客户端通信时,消息将被加密。

我已经让它部分工作了。如果我通过 HTTP 访问,一切都很好,除了没有加密,但如果我通过 HTTPS 访问,网页就会崩溃,我会收到以下错误:Mixed Content: The page at 'https://domain.com/service1' was loaded over HTTPS, but requested an insecure stylesheet 'http://domain.com/service1/blahblah.css'. This request has been blocked; the content must be served over HTTPS.

我也收到过这种警告:The page at 'https://domain.com/service1/' was loaded over HTTPS, but is submitting data to an insecure location at 'http://domain.com/service1/': this content should also be submitted over HTTPS.

现在,对于某些服务,我可以破解服务本身,以便修复它……但我不想这样做,因为那样的话,我就必须破解每一项服务,这很耗时,而且可能会破坏某些东西。我想尽可能少地接触服务。

我当前的配置在使用 hack 的情况下可以工作,但没有 hack 则无法工作。它涵盖了整个服务 1:

location /service1/ {
    proxy_pass              http://192.168.1.101/;

    proxy_read_timeout      3500;
    proxy_connect_timeout   3250;

    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        Host $host;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto https;

    proxy_set_header        SSL_PROTOCOL $ssl_protocol;
}

我在网上寻找通用解决方案,但只找到一种适用于一项服务的破解方法。其他 nginx 示例/操作指南没有太大帮助(仍然收到错误和警告)。

提前谢谢了!

答案1

您必须检查网站的代码,并将所有出现的 替换http://domain.com/resource/resource//domain.com/resource

这可以确保所有依赖的网页资源都使用与网站本身加载相同的协议加载。

答案2

这适用于 nginx https 代理 >> nginx http 服务 Django 后端

在位置指令内:

proxy_set_header X-Forwarded-Proto $scheme;

欲了解更多详细信息,值得阅读这篇精彩的文章:https://www.metaltoad.com/blog/running-drupal-secure-pages-behind-proxy

答案3

使用 nginx,我需要:

        add_header 'Content-Security-Policy' 'upgrade-insecure-requests';

答案4

settings.php,设置

$base_url='';

但是 bootstrap 会显示错误,因此请将下面的代码更改为/var/www/includes/bootstrap.inc

if (isset($base_url)) { 
//change to 
if (isset($base_url) && $base_url!='') {

相关内容