我有一个带有 Apache2 的 linode 服务器,运行一些带有虚拟主机的站点。
所有站点在端口 80 上运行良好,但有一个站点具有 SSL 证书并且运行正常。
我的问题如下:
非 https 网站,如果访问https://domain.com- 显示唯一安全站点的内容...
有没有办法禁用这些不安全网站的 *:443 匹配?
谢谢!
编辑(更多信息):
以下是针对普通不安全 http 站点的典型配置:
<VirtualHost *:80>
ServerName www.insecure.com
ServerAlias insecure.com
...
</VirtualHost>
安全https站点如下:
<VirtualHost *:80>
ServerName www.secure.com
Redirect permanent / https://secure.com/
</VirtualHost>
<VirtualHost *:80>
ServerName secure.com
RedirectMatch permanent ^/(.*) https://secure.com/$1
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLProtocol all
SSLCertificateChainFile ...
SSLCertificateFile ...
SSLCertificateKeyFile ...
SSLCACertificateFile ...
ServerName secure.com
ServerAlias secure.com
...
</VirtualHost>
因此,访问:
- http:/insecure.com – 有效
- http:/www.insecure.com - 有效
- http:/secure.com - 重定向到 https:/secure.com - 有效
- http:/www.secure.com - 重定向到 https:/secure.com - 有效
- https:/insecure.com – 显示 https:/secure.com – 错误!
答案1
Apache 文档建议在 NameVirtualHost 行上指定非 SSL 端口号,如下所示:
名称虚拟主机 192.168.1.1:80
这有帮助吗?它应该会停止非安全站点匹配。否则,请尝试将安全站点移至 VirtualHosts 中的第一个。
答案2
问题是 HTTPS 不使用主机标头,因为证书交换发生在客户端连接到 443 时。因此,虽然您可以使用 mod_rewrite 根据 HTTP_HOST 重定向回,https://insecure.com
但这http://insecure.com
是在向用户显示有关主机名不匹配的证书警告之后。
但像这样的事情应该在您的 https 配置块中工作
RewriteCond %{HTTP_HOST} !^secure\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://%{HTTP_HOST}/$1 [L,R]
答案3
正如 Peter 所说,将 VirtualHost 绑定到显式 IP。如果您有多个 IP,这应该可以立即解决您的问题。
如果您在单个 IP 上运行,请确保在 :443 VirtualHost(s) 中定义明确的 ServerName。
还要记住,Apache 有默认的 VirtualHosts,这也可能会对您不利。对于给定端口,首先定义的 VirtualHost 将成为默认的。我经常发现自己定义显式 VirtualHosts 来解决这个问题。也许在您的场景中,您可以创建一个一次性 VirtualHost 并连接一个自签名证书。这应该允许您明确定义的站点独立存在。
编辑:考虑到 Doon 的评论后,我收回我对 ServerName 的评论。
你可能想看看基于名称的 SSLV 主机在 Apache wiki 上,但我不认为这能解决您的问题,因为从您的示例来看,使用了不同的域。如果它们是共享通配符证书的子域,则此方法有效。