Virtualhost 一个 https 站点,其余 http

Virtualhost 一个 https 站点,其余 http

我有一个带有 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 上,但我不认为这能解决您的问题,因为从您的示例来看,使用了不同的域。如果它们是共享通配符证书的子域,则此方法有效。

相关内容