通过apache虚拟主机重定向到其他域的HTTPS

时间:2018-06-27 08:18:05

标签: apache ssl mod-rewrite https http-proxy

我想将服务器上的虚拟主机重定向到另一个在HTTPS上运行的域。我也只想显示原始网址,因此将P标志用于代理。这是当前的配置:

RewriteEngine on
SSLProxyEngine on
RewriteCond %{HTTP_HOST} ^subdomain1\.domain1\.ext1$ [NC]
RewriteRule ^(.*) https://subdomain2.domain2.ext2$1 [L,R,P]

我应该使用certbot在domain1上生成证书吗?我应该关联哪个Webroot?我应该包括domain2中的那个吗?

当前,我在error.log中有此内容:

[Wed Jun 27 09:13:42.011549 2018] [ssl:error] [pid 19805] [remote IP2:443] AH01961: SSL Proxy requested for domain1.ext1:80 but not enabled [Hint: SSLProxyEngine]
[Wed Jun 27 09:13:42.011734 2018] [proxy:error] [pid 19805] AH00961: HTTPS: failed to enable ssl support for IP2:443 (subdomain2.domain2.ext2)

但是设置了SSLProxyEngine

2 个答案:

答案 0 :(得分:0)

由于您没有显示VirtualHost设置,因此这是我从头开始的方法。

首先在第一个Apache服务器上为端口443设置VirtualHost:

Listen *:443
<VirtualHost *:443>
    ServerName www.domain1.com
    ServerAlias domain1.com

    SSLEngine On
    [... all our SSL directives, like certs ...]

    SSLProxyEngine on

    RewriteEngine On
    RewriteRule ^(.*) https://subdomain2.domain2.ext2/$1 [R=301,P]

</VirtualHost>
  • 对于您的RewriteRule,当您使用P标志时,L不是必需的,它是隐式的。
  • 您的RewriteCond并非严格要求,因为如果您在此VirtualHost中,则确实要求输入https://www.domain1.comhttps://domain1.com。但是,如果它是端口443上最顶级的VirtualHost,则可以将其用作端口443上整个请求的默认VirtualHost,因此也没有错。

然后在另一个服务器上的端口443上再次为domain2设置另一个VirtualHost:

Listen *:443
<VirtualHost *:443>
    ServerName www.domain2.com
    ServerAlias domain2.com

    SSLEngine On
    [... all our SSL directives, like certs ...]

    DirectoryIndex  ...
    [ ... other configurations to publish your pages ...]

</VirtualHost>
  • 您收到的错误消息说端口80未打开SSL,这是有道理的。如果您要求http://www.domain1.com,它将被发送到端口80上的匹配VirtualHost,该端口是HTTP,因此没有SSL。您应该要求https://www.domain1.com

如果要同时在两个系统上安装,则将出现一个小问题。您不能在SSL的相同IP和相同端口(443)上拥有两个具有不同域名的VirtualHost。这是因为直到之后协商证书,Apache才知道您要哪个域。因此解决此问题的方法是:

  • 两台服务器,每个HTTPS域一个。
  • 每个HTTPS域一个IP。您将执行Listen IP1:443Listen IP2:443并使用它们来设置VirtualHost。
  • 每个HTTPS域一个端口。您的domain1 VirtualHost可以使用端口443(https:// ... requets的默认端口)。您的domain2 VirtualHost可以使用任何其他端口,因为只有您知道该端口,并且对客户端不可见。您的RewriteRule将使用https://subdomain2.domain2.ext2:<THE PORT>/$1

但这是一个漫长的主题,您需要做一些研究以了解在同一服务器上运行许多HTTPS站点的所有细节。

答案 1 :(得分:0)

最后,最好的解决方案是使用mod_proxy而不是mod-rewrite。

http版本(重定向到https)

<VirtualHost *:80>
    ServerName domain1.ext1
    ServerAlias subdomain1.domain1.ext1

    SSLProxyEngine on
    ProxyPass / https://subdomain2.domain2.ext2/
    ProxyPassReverse / https://subdomain2.domain2.ext2/
    ProxyPreserveHost Off

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =subdomain1.domain1.ext1
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</VirtualHost>

https版本

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName domain1.ext1
    ServerAlias subdomain1.domain1.ext1

    SSLProxyEngine on
    ProxyPass / https://subdomain2.domain2.ext2/
    ProxyPassReverse / https://subdomain2.domain2.ext2/
    ProxyPreserveHost Off

    SSLCertificateFile /etc/letsencrypt/live/subdomain1.domain1.ext1/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/subdomain1.domain1.ext1/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>