为什么 Apache 可能会忽略 ServerName 与请求的 URL 匹配的虚拟主机?

为什么 Apache 可能会忽略 ServerName 与请求的 URL 匹配的虚拟主机?

我正在尝试向我的 apache 配置中添加第二个虚拟主机,但似乎无法使用新的虚拟主机。

我的httpd.conf只包含以下行:

ServerName radiofreebrighton.org.uk

我还有一个ports.conf文件,其中包含以下内容:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

我有两个文件,sites-available其中被sites-enabled符号链接到a2ensite

  • radiofreebrighton.org.uk
  • trafalgararches.co.uk

第一个内容是:

<VirtualHost _default_:80>
    DocumentRoot /home/tom/www

    ServerAdmin [email protected]
    ServerName radiofreebrighton.org.uk
    ServerAlias www.radiofreebrighton.org.uk

    <Directory /home/tom/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log
    LogLevel error
    CustomLog /var/log/apache2/access.log combined

    Alias /wiki /home/tom/www/mediawiki/index.php
</VirtualHost>

后者的内容为:

<VirtualHost *:80>
    DocumentRoot /home/tom/tata-www

    ServerAdmin [email protected]
    ServerName trafalgararches.co.uk
    ServerAlias www.trafalgararches.co.uk

    <Directory /home/tom/tata-www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    logLevel error
    ErrorLog /var/log/apache2/error.log
</VirtualHost>

但每次我请求 trafalgararches.co.uk 的页面时,我都会得到来自 radiofreebrighton.org.uk 的页面。为什么会发生这种情况?我该如何修复它?


编辑:

apache 理解的虚拟主机配置:

tom@rfb:/usr/local$ apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost trafalgararches.co.uk (/etc/apache2/sites-enabled/trafalgararches.co.uk:1)
Syntax OK

(摘自apache2ctl -Saka httpd -S。)

答案1

这可能是显而易见的,但是不要忘记重新启动 apache 服务启用附加虚拟主机后。

在为第二个虚拟主机执行之后a2ensite,输出apache2ctl -S反映两个站点都已配置(其中一个是默认站点),但直到重新加载 apache 后它才会生效。


假设您有两个虚拟主机 - site1 和 site2。您运行a2ensite site1并重新加载 apache 服务。现在您可以访问http://site1并且它是默认的。现在您运行a2ensite site2,但忘记重新启动 apache。输出将apache2ctl -S是:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site2 (/etc/apache2/sites-enabled/site2:1)
Syntax OK

但是当您尝试加载时http://site2,它实际上会加载默认站点(site1),因为配置未加载。

答案2

我遇到了类似的问题,端口 443 (SSL/HTTPS) 上的附加虚拟主机都被定向到列出的第一个虚拟主机的目录。Apache 本质上忽略了服务器名称属性,只匹配 ip:port。

事实证明,我缺少命令“NameVirtualHost *:443”来为端口 443 启用命名虚拟主机。

'NameVirtualHost *:443' 只需调用一次,并且必须在端口 443 的虚拟主机上方定义。我将我的定义放在 ports.config 文件中,因此它看起来像:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

不要忘记在进行任何更改后重新启动 apache。

答案3

我的意见:因为我必须坚持使用一个 IP(我不希望网站在所有安装的网络上提供服务),所以在服务器的本地私有 IP 发生变化后,我忘记在这里更改它了:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

当然,让你知道IP在本地不存在并不是Apache的问题。

答案4

我发现该问题的根源是我的服务器上的 /etc/hosts 条目,其中的 URL 指向服务器的外部 IP。

有一次我必须在 DNS 准备好之前进行设置,所以我在服务器上输入了一个指向其自己的外部 IP 的 /etc/hosts 条目:

1.2.3.4 vhost.example.com

然后我为现有网站“vhost.example.com”设置了一个 ServerAlias

但无论我做什么,都无法阻止 Apache 为 vhost.example.com 的 SSL 请求提供 default-ssl.conf 站点。端口 80 HTTP 工作正常,但 SSL 总是显示默认站点。最后,这个 SO 线程让我尝试“apachectl -S”,它显示了站点,最后我终于搞清楚了。

因此,如果您访问的是默认 SSL 站点,而不是您期望的站点,请确保您没有在 /etc/hosts 条目中添加服务器的外部 IP 地址!事后看来,这是一件很奇怪的事情,但希望这能帮助别人!

相关内容