使用 apache 虚拟主机重定向到其他域的 HTTPS

HTTPS with redirection to other domain with apache virtual host

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

RewriteEngine on
SSLProxyEngine on
RewriteCond %{HTTP_HOST} ^subdomain1\.domain1\.ext1$ [NC]
RewriteRule ^(.*) https://subdomain2.domain2.ext2 [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 已设置。

由于您没有显示您的 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/ [R=301,P]

</VirtualHost>
  • 对于您的 RewriteRule,当您使用 P 标志时 L 不是必需的,它是隐式的。
  • 你的 RewriteCond 并不是严格要求的,因为如果你在这个 VirtualHost 中,你确实要求 https://www.domain1.com or https://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>
  • 你得到的错误是 SSL 没有打开端口 80,这是有道理的。如果你要求 http://www.domain1.com 这将发送到端口 80 上匹配的 VirtualHost,这是 HTTP,因此没有 SSL。你应该要求 https://www.domain1.com.

如果你想把两者都放在一个系统上,你会遇到一个小问题。您不能在同一 IP 和 SSL 的同一端口 (443) 上拥有两个具有不同域名的 VirtualHost。这是因为 Apache 直到 证书协商后才知道您想要哪个域。所以解决这个问题的方法是:

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

但这是一个很长的主题,您需要对同一服务器上的 运行 许多 HTTPS 站点进行一些研究以了解所有详细信息。

最后,最好的解决方案是使用 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>