Apache 从服务器主机名提供基于名称的虚拟主机(但不应该)

Posted

技术标签:

【中文标题】Apache 从服务器主机名提供基于名称的虚拟主机(但不应该)【英文标题】:Apache serving name-based virtual Host from server hostname (but shouldn't be) 【发布时间】:2018-09-08 00:14:09 【问题描述】:

我有一个在 Centos 上运行的 Apache httpd 服务器(2.4.6),为多个基于名称的虚拟主机提供服务。服务器的 fqdn / 主机名应该不提供任何内容,但它重定向到基于名称的虚拟主机之一,我不明白为什么或如何停止它。

在下面的配置中,对http://host.mydomain.org/ 的请求被重定向到http://www.customer.co.uk/。

任何关于为什么的想法,以及阻止它的正确方法。

我的 httpd.conf 是:

ServerRoot "/etc/httpd"
Listen 80

Include conf.modules.d/*.conf

User apache
Group apache

ServerAdmin root@xxx.org
ServerName host.mydomain.org:80

<Directory />
    AllowOverride none
    Require all denied
</Directory>

DocumentRoot "/var/www/html"

<Directory "/var/www">
    AllowOverride None
    Require all denied
</Directory>

<Directory "/var/www/html">
        Options None
    AllowOverride None
    Require all denied
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog "logs/error_log"
LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
</IfModule>

<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all denied
</Directory>

<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddHandler cgi-script .cgi
    AddHandler cgi-script .pl
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>

AddDefaultCharset ISO-8859-1

<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>

EnableSendfile on
TraceEnable Off
ServerTokens Prod

IncludeOptional conf.d/*.conf

一个示例虚拟主机是:

<VirtualHost *:80>
    DocumentRoot /home/xxx/customer/docs
    ServerName www.customer.co.uk
    ErrorLog /home/xxx/customer/logs/error_log
    CustomLog /home/xxx/customer/logs/access_log combined
        <Directory /home/xxx/customer/docs>
                AllowOverride None
                Options None
                Require all granted
        </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName customer.co.uk
    Redirect permanent / http://www.customer.co.uk/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.customer.mydomain.org
    Redirect permanent / http://www.customer.co.uk/
</VirtualHost>

非常感谢 凯文

【问题讨论】:

您确定您的机器中没有设置任何 IPTABLES 或 /etc/hosts 用于重定向 host.mydomain.org 或它的 IP 吗?或者另一个机会是它可能是从您的代理服务器转发的。所以请确保httpd服务器停止时它没有转发。 你在测试什么?浏览器应该Redirect permanent存储一段未指定的时间,wgetcurl更适合查找重定向问题。 您的配置中有三个&lt;VirtualHost *:80&gt; 标签,这不是必需的。您可以将所有内容写入 virtualHost 标签内,就像它在单个标签中一样。 【参考方案1】:

配置文件中的第一个 VirtualHost 具有最高优先级,可以看作是默认或主服务器。这意味着如果收到的请求与指定的 ServerNameServerAlias 指令之一不匹配,它将由第一个 &lt;VirtualHost&gt; 提供服务。

您可以通过添加这个(例如)作为第一个虚拟主机来防止这种情况:

<VirtualHost *:80>
    ServerName default
    RewriteEngine On
    RewriteRule ^ - [F]
</VirtualHost>

【讨论】:

以上是关于Apache 从服务器主机名提供基于名称的虚拟主机(但不应该)的主要内容,如果未能解决你的问题,请参考以下文章

apache的虚拟目录和多端口多主机名的配置

Apache虚拟目录和多端口多主机名配置

apache 虚拟主机(EAI 2)名称或服务未知:AH00547:无法解析主机名

Apache虚拟目录和多端口多主机名配置

Apache搭建Web主机(虚拟目录分别基于IP地址端口主机名)

linux[基础]-29-[Apache服务]-[虚拟主机]-[04]