使用 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:443
和 Listen 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>
我想将我服务器上的虚拟主机重定向到另一个域,即 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:443
和Listen 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>