ProxyPassReverse丢弃HTTPS

Pat*_*cci 3 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,必须不断重新添加它.显然我做错了什么.

我已经设置了一个VirtualHost subsonic.domain.com,我正在尝试使用ProxyPassProxyPassReverse以我想要的方式重定向流量.这是我的VirtualHost这个网站:

    <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>
Run Code Online (Sandbox Code Playgroud)

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

任何建议都是最受欢迎的.

编辑

关于我正在尝试做什么的一点澄清.我想让我的Apache服务器完成所有重定向和处理所有SSL请求.基本上,从浏览器到Apache服务器是HTTPS,ProxyPass从Apache服务器到应用服务器我们都是未加密的HTTP(很好,这是我的内部网络),ProxyPassReverse从应用服务器到Apache服务器都是纯HTTP,然后Apache服务器将流量作为HTTPS发送出去.

这是另一个VirtualHost,可以为不同的子域执行我想要的操作.这是经过测试并且100%工作.我通过HTTPS连接到我的Apache服务器,Apache服务器用普通的旧HTTP连接我自己的Cloud服务器,对我的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>
Run Code Online (Sandbox Code Playgroud)

Jas*_*ncl 12

所以我也遇到了这个问题,并且在评论时ProxyPreserveHost修复了上面配置的问题,有一种更好的方法.

ProxyPass1条语句告诉Apache采取对URI的输入请求,并通过它传递给指定的主机.使用时ProxyPreserveHost On,Apache不会更改Host: HTTP标头并且不会修改请求.(默认情况下,它会更改它以匹配ProxyPass语句中指定的后端主机).

ProxyPassReverse2语句告诉Apache,以配合指定的主机的主机:头就传出响应,如果它匹配调整位置:,内容位置:URI:头到虚拟主机匹配,或者更具体什么阿帕奇认为是规范名称.

所以使用以下配置:

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

    ProxyPass / http://192.168.1.5:4040/
    ProxyPassReverse / http://192.168.1.5:4040/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

这是一个要求:

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>
Run Code Online (Sandbox Code Playgroud)

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