之前我在这里问过一个问题:为共享 IP 上的所有域名提供单域 SSL关于在单个 IP 上设置安全域和非安全域。
大家的意见不一,但看来 SNI 是解决方案。不幸的是,我无法让它按要求工作。
- https://domaina.com— 按预期工作
- https://domainb.com— 提供 domaina.com 证书,不符合预期。我希望它不响应 SSL 请求。
我希望我的服务器只发送证书而不domaina.com
发送其他主机名,即使这意味着向非 SNI 客户端发送 403 错误。我在 vanilla Ubuntu Server 12.04 LTS 上的当前配置如下:
端口配置文件
…
<IfModule mod_ssl.c>
NameVirtualHost *:443
Listen 443
</IfModule>
…
域名A虚拟主机
<VirtualHost *:80>
ServerName domaina.com
ServerAlias www.domaina.com
DocumentRoot /var/www/domaina.com/public
ErrorLog /var/www/domaina.com/logs/error.log
CustomLog /var/www/domaina.com/logs/access.log combined
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName domaina.com
ServerAlias www.domaina.com
DocumentRoot /var/www/domaina.com/public
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/domaina.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/domaina.key
SSLCertificateChainFile /etc/apache2/ssl/domaina.com.ca-bundle
</VirtualHost>
</IfModule>
域名B虚拟主机
<VirtualHost *:80>
ServerName domainb.com
ServerAlias www.domainb.com
DocumentRoot /var/www/domainb.com/public
ErrorLog /var/www/domainb.com/logs/error.log
CustomLog /var/www/domainb.com/logs/access.log combined
</VirtualHost>
apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443 is a NameVirtualHost
default server domaina.com (/etc/apache2/sites-enabled/domaina.com:12)
port 443 namevhost domaina.com (/etc/apache2/sites-enabled/domaina.com:12)
*:80 is a NameVirtualHost
default server domaina.com (/etc/apache2/sites-enabled/domaina.com:3)
port 80 namevhost domaina.com (/etc/apache2/sites-enabled/domaina.com:3)
port 80 namevhost domainb.com (/etc/apache2/sites-enabled/domainb.com:1)
Syntax OK
如何摆脱默认设置?
答案1
在将两个域名保持在同一个 IP 地址上的同时,你实际上无法完成你所要求的事情。
现在,您有两个域(domaina.com 和 domainb.com)位于同一个 IP 地址上。然后,您已为 HTTP 打开了端口 80,为 HTTPS 打开了端口 443。正如您所注意到的,该端口对服务器上的所有域都开放;它不能只对一个域关闭,而对其他域保持开放。
如果您根本不希望为 domainb.com 开放 SSL,则需要将 domainb.com 放在单独的 IP 地址上。
答案2
或者,您可以只使用 .htaccess 来适当地重定向请求。这不是最好的解决方案,但如果您必须使用单个 IP,那么这可能适合您。
因此,domaina.com 的 .htaccess 可能有类似内容
#redirect domainb https requests
RewriteCond %{HTTP_HOST} ^domainb.com$
RewriteRule ^(.*)$ http://domainb.com%{REQUEST_URI} [L,R=301]