Apache 回答请求它不应该

jdo*_*dog 1 redirect virtualhost apache-2.2

我有以下 2 个域记录

website.com 10.0.0.1
www.website.com 10.0.0.1
Run Code Online (Sandbox Code Playgroud)

我有(有)以下 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>
Run Code Online (Sandbox Code Playgroud)

我预计对http://website.com的请求将返回 404。但是它的服务就像是从http://www.website.com传递的一样。为什么?

Mar*_*rty 7

LazyOne 是完全正确的。只要您NameVirtualHost整理了指令,就会使用VirtualHost为请求的IP 地址定义的第一个指令,如果没有其他指令ServerNameServerAlias匹配项存在。

因此,如果您想为每个未命中主机标头匹配的 ip 地址提供 404,请创建一个VirtualHost(每个 ip)而不使用ServerNameorServerAlias指令,并将其放置在配置中,以便首先加载。就像是:

<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>
Run Code Online (Sandbox Code Playgroud)

更新:以下大部分内容来自 apache2 文档,herehere

主配置文件,通常命名为 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/
Run Code Online (Sandbox Code Playgroud)

换句话说,任何.conf以 mods-enabled/结尾的文件都在 httpd.conf 之前加载,在ports.conf 之前加载,在 conf.d/ 中的任何文件之前加载,等等。