【问题标题】:ProxyPassReverse dropping HTTPSProxyPassReverse 丢弃 HTTPS
【发布时间】:2018-02-06 04:31:10
【问题描述】:

在我的家庭网络中,我有一个 Web 服务器和一个 DNS 服务器。我有各种其他应用程序服务器,我已经为其添加了重定向,因此我可以简单地访问像 myapplication.domain.comwww.domain.com/application 这样的网站来访问我的各种服务。我有一个在另一台服务器上运行的 Subsonic 服务器,我的目标是能够访问 https://subsonic.domain.com 并在我的 Web 服务器上通过 SSL 获得我的 Subsonic 流量。最终我希望在家外访问它,这就是为什么通过 HTTPS 代理不安全的 HTTP 流量很重要的原因,但现在,我只是想让它在家里工作。

当我访问https://subsonic.domain.com 时,我最终收到“无法连接”错误。我似乎被重定向到的地址是subsonic.domain.com/login.view。如果我将 HTTPS 添加到该 URL 的前面,我会得到我正在寻找的登录页面。但是,一旦我再次登录,URL 就会发生变化,我会被重定向,最终我会再次丢失 HTTPS,不得不继续重新添加它。显然我做错了什么。

我已经为subsonic.domain.com 设置了一个虚拟主机,并尝试使用ProxyPassProxyPassReverse 以我想要的方式重定向流量。这是我的这个网站的虚拟主机:

    <VirtualHost subsonic.domain.com:443>

        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*[^/])$ /$1/ [L,R=301]

        ProxyRequests Off
        ProxyErrorOverride Off
        ProxyPreserveHost On

        ServerAdmin webmaster@localhost

        ProxyPass / http://192.168.1.5:4040/
        ProxyPassReverse / http://192.168.1.5:4040/

        SSLEngine on

        SSLCertificateFile      /etc/apache2/ssl/apache.crt
        SSLCertificateKeyFile   /etc/apache2/ssl/apache.key

    </VirtualHost>

SSL 绝对可以正常运行。我有另一个相同的虚拟主机,用于另一个工作正常的目录(在https://www.domain.com/directory 上重定向),所以我不确定问题出在哪里。在 ProxyPassReverse 之后,URL 似乎只是丢失了 https:// 部分。如果我添加它,该站点可以正常工作,直到我访问另一个页面并且https:// 再次丢失。如果我直接在http://192.168.1.5:4040 访问应用程序服务器,我没有任何问题。

欢迎任何建议。

编辑

稍微澄清一下我正在尝试做的事情。我想让我的 Apache 服务器完成我所有的重定向和处理我所有的 SSL 请求。基本上,从浏览器到Apache服务器是HTTPS,从Apache服务器到应用程序服务器的ProxyPass我们未加密的HTTP(这很好,这是我的内部网络),从应用程序服务器到Apache的ProxyPassReverse服务器是纯 HTTP,然后 Apache 服务器以 HTTPS 发送流量。

这是另一个虚拟主机,可以为不同的子域执行我想要的操作。这是经过测试并且可以 100% 工作的。我通过 HTTPS 连接到我的 Apache 服务器,Apache 服务器以普通的旧 HTTP 联系我 ownCloud 服务器,对我的 Apache 服务器的响应是普通 HTTP,然后 Apache 服务器以 HTTPS 向浏览器返回请求:

<VirtualHost www.domain.com:443>

            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*[^/])$ /$1/ [L,R=301]

            ProxyRequests Off
            ProxyErrorOverride Off
            ProxyPreserveHost On

            ServerAdmin webmaster@localhost

            ProxyPass /owncloud/ http://192.168.1.251/owncloud/
            ProxyPassReverse /owncloud/ http://192.168.1.251/owncloud/

            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined

            SSLEngine on

            SSLCertificateFile      /etc/apache2/ssl/apache.crt
            SSLCertificateKeyFile   /etc/apache2/ssl/apache.key

</VirtualHost>

【问题讨论】:

  • 您的亚音速后端尚未发送加密流量,是吗?我很困惑,因为我想不出你为什么要在 ProxyPass-Reverse 上指定不同的协议。
  • 不,Subsonic 后端提供纯 HTTP。我不是想为 ProxyPass 和 Reverse 指定不同的协议,据我了解它们都应该是 HTTP。一分钟后我会发布我的另一个虚拟主机。它与上面的几乎相同。它从应用服务器传递 HTTP 并将其作为 HTTPS 发送出去。
  • 我想你会在 ProxyPass 和 -Reverse 上都需要http://,然后 SSL 将在 Apache 层被剥离。
  • 我相信这是正确的,这就是它在我的其他虚拟主机上的工作方式。我刚刚编辑了我的原始帖子,以展示这个工作的一个例子,并澄清我在寻找什么。
  • Ulrich,很抱歉造成混乱,我没有意识到我的帖子的背面有https://。我在背面有https:// 用于测试目的,但后来删除了它。即使在 ProxyPass 和 Reverse 上使用 http://,它仍然无法正常工作。我已经编辑了我的原始帖子。

标签: apache mod-proxy ubuntu-14.04


【解决方案1】:

所以我也遇到了这个问题,在注释掉 ProxyPreserveHost 的同时解决了上面配置的问题,还有更好的方法。

ProxyPass1 语句告诉 Apache 接受 URI 上的传入请求并将其传递给指定的主机。使用ProxyPreserveHost On,Apache 不会更改 Host: HTTP 标头,并且不加修改地传递请求。 (默认情况下,它会更改它以匹配ProxyPass 语句中指定的后端主机)。

ProxyPassReverse2 语句告诉 Apache 匹配在传出响应中使用 Host: 标头指定的主机,如果匹配则调整 Location:Content-Location:URI: 标头以匹配 VirtualHost 或更具体地说是 Apache 认为的规范名称。

所以用下面的配置:

<VirtualHost subsonic.domain.com:443>
    ProxyPreserveHost On

    ProxyPass / http://192.168.1.5:4040/
    ProxyPassReverse / http://192.168.1.5:4040/
</VirtualHost>

这是一个请求:

https://subsonic.domain.com/ -> http://192.168.1.5:4040/

但由于 ProxyPreserveHost 已打开,它会将请求中的 Host: 标头原封不动地保留为 subsonic.domain.com

您的 Web 应用程序很可能发送来自 subsonic.domain.com 的响应,但这与您指定的 ProxyPassReverse 规则不匹配:

http://subsonic.domain.com/ http://subsonic.domain.com/

所以配置:

<VirtualHost subsonic.domain.com:443>
    ProxyPreserveHost On

    ProxyPass / http://192.168.1.5:4040/
    ProxyPassReverse / http://subsonic.domain.com/ # Changed to match canonical host
</VirtualHost>

此规则应与来自代理主机的回复相匹配。

【讨论】:

  • 非常感谢,这种详细的回复正是我要找的澄清。由于我的配置暂时有效,我不会修改,但由于某种原因,配置每隔几个月就会中断一次,而我没有做任何事情,这将是一个有用的资源。
  • 感谢这拯救​​了我的一天 ;-)
  • 谢谢。我也错过了第二行。 (代理主机有我没有考虑的 ServerAlias。)答案的简短版本是:帐户所有已知的服务器名称
【解决方案2】:

在我的 Subsonic VirtualHost 中,我不得不禁用 ProxyPreserveHost On 指令。我现在可以从外部和内部访问该站点。

出于某种原因,这对我的另一个 VirtualHost 来说工作得很好,但对于这个却没有。我假设这是因为在我的一个 VirtualHost 中,ProxyPass 正在处理目录而不是主机名。在我的 Subsonic VirtualHost 中,我没有指定目录。

对于任何真正知道他们在谈论 Apache、VirtualHosts、重定向等的人,如果我没有准确描述正在发生的事情,请随时澄清。

这是我的虚拟主机,供遇到同样问题的其他人使用。

    <VirtualHost subsonic.domain.com:443>

        #RewriteCond %{REQUEST_FILENAME} !-d
        #RewriteCond %{REQUEST_FILENAME} !-f
        #RewriteRule ^(.*[^/])$ /$1/ [L,R=301]

        ProxyRequests Off
        ProxyErrorOverride Off
        #ProxyPreserveHost On - This line now commented out

        ServerAdmin webmaster@localhost

        ProxyPass / http://192.168.1.5:4040/
        ProxyPassReverse / http://192.168.1.5:4040/

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine on

        SSLCertificateFile      /etc/apache2/ssl/apache.crt
        SSLCertificateKeyFile   /etc/apache2/ssl/apache.key

</VirtualHost>

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多