由主服务器而不是虚拟主机(Apache 2.2.15)提供的站点的 SSL 版本

由主服务器而不是虚拟主机(Apache 2.2.15)提供的站点的 SSL 版本

我在端口 80 和 443 上有多个虚拟主机。它们都正常工作。当使用未提及为 vhost 的名称来寻址 Web 服务器时,就会出现问题。

文档说:

如果查找失败(未找到 IP 地址),则请求将从默认vhost(如果客户端发送请求的端口有这样的 vhost)。如果没有匹配的 默认vhost 请求由 main_server 提供服务。

但在我的例子中,内容是来自 main_server 的服务器,而不是默认的 vhost。我尝试过同时使用_default_*这个默认 vh

我有

NameVirtualHost *:80
NameVirtualHost *:443

以及如下指令:

<VirtualHost *:80>
        ServerName example.com
        ServerAlias www.example.com

<VirtualHost *:443>
        ServerName example.com
        ServerAlias www.example.com

运行apachectl -S显示我精心命名的默认虚拟主机。

wildcard NameVirtualHosts and _default_ servers:
*:443                  is a NameVirtualHost
     default server 00default.example.com (/etc/httpd/sites.d/00default.example.com:29)
     port 443 namevhost 00default.example.com (/etc/httpd/sites.d/00default.example.com:29)
         alias www.00default.example.com
     port 443 namevhost example.com (/etc/httpd/sites.d/example.com:29)
         alias www.example.com

...

*:80                   is a NameVirtualHost
     default server 00default.example.com (/etc/httpd/sites.d/00default.example.com:1)
     port 80 namevhost 00default.example.com (/etc/httpd/sites.d/00default.example.com:1)
         alias www.00default.example.com
     port 80 namevhost example.com (/etc/httpd/sites.d/example.com:1)
        alias www.example.com

如果我访问

http://www.example.com/phpinfo/

它工作正常。但是

https://www.example.com/phpinfo/

失败。这是因为 Apache 尝试从默认 conf 文件中为主服务器配置的文档根目录来处理此请求。“主服务器”定义如下:http://httpd.apache.org/docs/2.2/vhosts/details.html

www.example.com 是服务器的实际主机名,

https://www/phpinfo/

或者

https://ip.address/phpinfo/

两种方法均可。

据我了解,通配符默认虚拟主机会覆盖主服务器配置,就像 HTTP 版本的情况一样。为什么它不适用于 HTTPS 版本?

示例 Vhost 配置:

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/example.com
    #ErrorLog logs/example.com/error_log
    #TransferLog logs/example.com/access_log
    SSLEngine on
    SSLCertificateFile /etc/httpd/certs.d/example.com.crt
    SSLCertificateKeyFile /etc/httpd/certs.d/example.com.key
    SSLCertificateChainFile /etc/httpd/certs.d/example.com.chain
    <Directory />
            Options FollowSymLinks
            AllowOverride None
    </Directory>
    <Directory /var/www/example.com/>
            AddType application/x-httpd-php .php
    </Directory>
    <Directory /var/www/example.com/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>
</VirtualHost>

在上面的部分之前还有一个部分,针对端口 80,除了端口和没有以“SSL”开头的行之外,其他部分均相同。

答案1

定义“失败”。您是否为默认虚拟主机安装了 SSL 证书?您是否只是收到有关证书错误的浏览器警告?或者您实际上是否收到了错误的内容?

你的浏览器是否支持信噪比?需要 SNI 来处理安装在同一 IP 的多个 SSL 证书。

答案2

看了您的评论后,我将按照以下方法实现您的要求:

(可能有更好的方法,但这个有效)

使用 DocumentRoot 属性设置 2 个不同的根:

<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName example.com
DocumentRoot /var/ssl_content
</VirtualHost>

<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName example.com
DocumentRoot /var/www
</VirtualHost>

接下来,将端口 80 虚拟主机根目录符号链接到端口 443 主机的新目录中

ln -s /var/www /var/ssl_content

这应该创建指向相同内容的 2 条路径,并允许超过 443 或 80 的请求。

相关内容