我在端口 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 的请求。