我有以下 2 个域名记录
website.com 10.0.0.1
www.website.com 10.0.0.1
我有以下 2 个虚拟主机
#note how the IP address is wrong
<VirtualHost 10.0.0.2:80>
ServerName website.com
Redirect / http://www.website.com
</VirtualHost>
<VirtualHost 10.0.0.1:80>
ServerName www.website.com
#note how there is no alias here
DocumentRoot /var/www/www.website.com
<IfModule mpm_itk_module>
AssignUserId www-website www-website
</IfModule>
CustomLog /var/log/apache2/www.website.com-access.log combined
ErrorLog /var/log/apache2/www.website.com-error.log
</VirtualHost>
<VirtualHost 10.0.0.1:443>
ServerName www.website.com
DocumentRoot /var/www/www.website.com
<IfModule mpm_itk_module>
AssignUserId www-website www-website
</IfModule>
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/www.website.com
CustomLog /var/log/apache2/www.website.com-ssl-access.log combined
ErrorLog /var/log/apache2/www.website.com-ssl-error.log
</VirtualHost>
我预计http://website.com会返回 404。然而,它却像是从http://www.website.com。 为什么?
答案1
LazyOne 完全正确。只要你NameVirtualHost
整理好指令,那么第一个VirtualHost
为IP地址ServerName
如果不存在其他或匹配项,则使用请求的ServerAlias
。
因此,如果您想要为每个未命中主机头匹配的 IP 地址提供 404,请创建一个VirtualHost
不带ServerName
orServerAlias
指令的 (per ip),并将其放置在配置中,以便首先加载它。类似:
<VirtualHost 10.0.0.1:80>
Redirect 404 /
</VirtualHost>
<VirtualHost 10.0.0.2:80>
Redirect 404 /
</VirtualHost>
<VirtualHost 10.0.0.2:80>
ServerName website.com
Redirect / http://www.website.com
</VirtualHost>
<VirtualHost 10.0.0.1:80>
ServerName www.website.com
#note how there is no alias here
DocumentRoot /var/www/www.website.com
...
</VirtualHost>
更新:下面的大部分内容摘自 apache2 文档,这里和这里。
首先加载主配置文件,通常名为 httpd.conf。但是,如果您在基于 debian 的系统上使用二进制包,则很有可能将其称为 apache2.conf。使用Include
主配置中的指令添加其他配置文件。Include
允许多次使用该指令。Include
指令可以使用 fnmatch 样式的通配符一次加载多个配置文件,例如按字母顺序。
为了进一步澄清(希望如此),首先加载的是主配置。遇到Include
指令时,它们会按照在主配置中出现的顺序加载。如果个人Include
使用通配符,则按字母顺序加载匹配的每个配置文件。
在 Debian 服务器上,apache2.conf 可能看起来像这样:
# Include module configuration:
# ...
Include mods-enabled/*.conf
# Include all the user configurations:
Include httpd.conf
# Include ports listing
Include ports.conf
# ...
# Include generic snippets of statements
Include conf.d/
# Include the virtual host configurations:
Include sites-enabled/
换句话说,任何.conf
以 mods-enabled/ 结尾的文件都会在 httpd.conf 之前加载,而 httpd.conf 又在 ports.conf 之前加载,而 ports.conf 又在 conf.d/ 中的任何文件之前加载,等等。