ProxyPassReverse丢弃HTTPS

时间:2014-06-22 13:35:31

标签: apache mod-proxy ubuntu-14.04

在我的家庭网络上,我有一个Web服务器和一个DNS服务器。我有各种其他应用程序服务器,我已添加重定向,因此我只需访问myapplication.domain.comwww.domain.com/application等网站即可访问我的各种服务。我有一台在另一台服务器上运行的Subsonic服务器,我的目标是能够访问https://subsonic.domain.com并在我的网络服务器上通过SSL获取我的Subsonic流量。最终我希望从家庭外部访问这个,这就是为什么通过HTTPS代理非安全的HTTP流量非常重要,但就目前而言,我只是想让它在家里工作。

当我访问https://subsonic.domain.com时,我最终得到一个"无法连接"错误。我似乎被重定向到的地址是subsonic.domain.com/login.view。如果我将HTTPS添加到该URL的前面,我将获得我正在寻找的登录页面。然而,一旦我再次登录,URL就会改变,我被重定向,我最终再次失去了HTTPS,必须不断重新添加它。显然我做错了。

我为subsonic.domain.com设置了一个VirtualHost,并尝试使用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>

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连接我的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>

2 个答案:

答案 0 :(得分:12)

所以我也遇到了这个问题,虽然注释ProxyPreserveHost修复了上面配置的问题,但还有更好的方法。

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

ProxyPassReverse 2 语句告诉Apache将指定的主机与传出响应上的主机:标头匹配,如果匹配则调整位置内容位置 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/ - &gt; http://192.168.1.5:4040/

但是自从ProxyPreserveHost启用后,它会将请求中的主机:标头保留为subsonic.domain.com

您的网络应用程序最有可能从subsonic.domain.com发送回复,但该回复与您指定的ProxyPassReverse规则不符:

http://subsonic.domain.com/&lt; - 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>

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

答案 1 :(得分:3)

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

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

对于任何真正了解他们在Apache,VirtualHosts,重定向等方面所谈论的内容的人,请随时澄清我是否没有准确描述正在发生的事情。< / p>

对于遇到同样问题的其他人来说,这是我的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 - 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>