apache - ProxyPassReverse 删除 HTTPS

标签 apache mod-proxy ubuntu-14.04

在我的家庭网络上,我有一个 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 设置了 VirtualHost,并尝试使用 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(这很好,这是我的内部网络),ProxyPassReverse/code> 从应用程序服务器到 Apache 服务器是纯 HTTP,然后 Apache 服务器以 HTTPS 形式发送流量。

这是另一个 VirtualHost,它可以为不同的子域执行我想要的操作。这已经过测试并且 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>

最佳答案

所以我也遇到了这个问题,在注释掉 ProxyPreserveHost 修复上述配置的问题时,有一个更好的方法。

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

ProxyPassReverse 2 语句告诉 Apache 在传出响应中匹配使用 Host: header 指定的主机,如果匹配则调整 Location:Content- Location:URI: header 以匹配 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: header 完好无损地保留为 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>

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

关于apache - ProxyPassReverse 删除 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24351782/

相关文章:

regex - 正则表达式寻找多个值

c++ - 我如何在 Linux Ubuntu 14.04 LTS 上设置 freeglut 库

node.js - 安装 Node 模块时 node-gyp 重建错误

php - 配置 xampp 服务器 httpd.conf

regex - htaccess 重写适用于所有人,并非有意

apache - 使用 mod_include 和 mod_proxy 包含远程 .shtml 文件时出现乱码

apache - 当apache处理ssl时,如何让tomcat将重定向作为https url发送

php - 无法使用 PHP 在 mongodb 上进行身份验证

ruby-on-rails - Phusion Passenger 如何重用线程和进程?

apache 到 tomcat : mod_jk vs mod_proxy