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