在我的家庭网络上,我有一个Web服务器和一个DNS服务器。我有各种其他应用程序服务器,我已添加重定向,因此我只需访问myapplication.domain.com
或www.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,并尝试使用ProxyPass
和ProxyPassReverse
以我想要的方式重定向流量。这是我的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>
答案 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>