Apache 回应了不应提出的请求

Apache 回应了不应提出的请求

我有以下 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整理好指令,那么第一个VirtualHostIP地址ServerName如果不存在其他或匹配项,则使用请求的ServerAlias

因此,如果您想要为每个未命中主机头匹配的 IP 地址提供 404,请创建一个VirtualHost不带ServerNameorServerAlias指令的 (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/ 中的任何文件之前加载,等等。

相关内容