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


26

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

httpd.conf只包含以下行:

ServerName radiofreebrighton.org.uk

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

NameVirtualHost *:80
Listen 80

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

我有两个文件,sites-available这是符号链接到sites-enableda2ensite

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

第一个的内容是:

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

    ServerAdmin tom@radiofreebrighton.org.uk
    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 admin@trafalgararches.co.uk
    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
不能确定这是原因,但是您应该删除ServerNameServerAlias行尾的斜杠。另外,请确保您已重新启动apache。
EEAA 2011年

我几乎肯定这就是原因。这意味着请求中的主机名将永远与该虚拟主机的ServerName不匹配。
larsk 2011年

1
@ ErikA,@ larsks-你们使我的希望更高了!我删除了结尾的斜杠并重新启动了Apache,但是它没有任何改变。
汤姆·赖特

1
NameVirtualHost *:80您的配置中是否有某处?
larsk 2011年

1
我不确定上述网站是生产还是开发中的,但实际上转到那些URL确实会为我提供两个不同的页面(从外观上看正确的页面)。如果上面的虚拟主机在开发服务器上,请忽略此注释。否则,您可能已经在途中某个地方解决了问题,但仍然有一个缓存副本。
cyberx86 2011年

Answers:


15

嗯,这个问题已有一年多了,但我偶然发现了类似的“问题”。这可能很明显,但不要忘记在启用其他虚拟主机后重新启动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)。


我得到相同的输出,但是即使那样也不会加载第二个网站。
arqam

15

我有一个类似的问题,端口443(SSL / HTTPS)上的其他虚拟主机都被定向到列出的第一个虚拟主机的目录。Apache本质上忽略了servername属性,仅在ip:port上进行匹配。

原来我缺少命令'NameVirtualHost *:443'来启用端口443的命名虚拟主机。

“ NameVirtualHost *:443”仅需要调用一次,并且必须在您的虚拟主机上方为端口443进行定义。

NameVirtualHost *:80
Listen 80

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

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

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


1
对于Apache 2.4.18中值得的...,NameVirtualHost在启动时使用会产生以下消息:AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf
Lambart

4

我的2美分:由于我必须坚持使用IP(我不希望在安装的所有网络上都可以访问该站点),因此发生了服务器本地专用IP更改后,我忘记在此处进行更改的情况:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

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


2

汤姆,请看这里 http://httpd.apache.org/docs/2.0/en/mod/core.html#namevirtualhost

注意

请注意,是“主服务器”和任何 默认服务器将永远不会送达了到了NameVirtualHost IP地址的请求(除非出于某种原因,你指定了NameVirtualHost但随后没有定义该地址的任何VirtualHosts)。

因此,如果将默认值更改为服务器的ip地址,那应该没问题。


我尝试过,但是没有任何改变。我还想避免将自己绑定到特定IP,所以我将其改回原样。另外,我应该指出,默认的虚拟主机是可以正常工作的虚拟主机。
汤姆·赖特

1

我从这里找到答案:http : //alexking.org/blog/2007/11/01/apache-2-only-serves-first-virtual-host

将2个服务器名放在相同的1个VirtualHost标记中,如下所示:

<VirtualHost *:80>
ServerName beta-site-1.com
DocumentRoot "/Library/WebServer/beta-site-1"

ServerName beta-site-2.com
DocumentRoot "/Library/WebServer/beta-site-2"
</VirtualHost>

我最后遇到了第二个站点的问题,因为我有两个VirtualHost标签块。


0

将网站迁移到新的Ubuntu 16服务器时遇到了这个问题。经过一番苦思冥想之后,我意识到默认情况下未启用SSL模块,因此<IfModule mod_ssl.c>块内的任何内容当然都会被忽略。

多年前,我将所有SSL虚拟主机都打包为这种条件,而这次我只是将配置文件复制到了新服务器上。

我通过启用模块来修复它:

sudo a2enmod ssl

0

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

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

1.2.3.4 vhost.example.com

然后,我将ServerAlias设置为“ vhost.example.com”的现有站点

但是我无能为力,无法阻止Apache为对vhost.example.com的SSL请求提供default-ssl.conf网站。端口80 HTTP工作正常,但SSL始终显示默认站点。最后,这个SO线程使我尝试了“ apachectl -S”,该站点显示了站点,最后我得以弄清楚了。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.