VirtualHost 的服务器名称不起作用(显示 /var/www),所有别名都起作用

VirtualHost 的服务器名称不起作用(显示 /var/www),所有别名都起作用

我已经安装了 apache 2 并且创建并启用了虚拟主机。

虚拟主机具有:ServerName example.com ServerAlias *.example.com ServerAlias foo.com ServerAlias *.foo.com ServerAlias bar.com ServerAlias *.bar.com

如果我直接将浏览器指向www.example.com, 测试.example.com、foo.com、www.foo.com 等,除了裸服务器名称之外的任何内容,它都按预期工作,显示 /srv/www/example.com/public_html/index.php 的内容,它是虚拟主机的 DocumentRoot。

然而,如果我只写“示例.com“在浏览器中,我看到的内容/var/www/index.html

它没有缓存在浏览器中,我已经清除了缓存,也尝试了另一个浏览器并通过代理尝试。

我觉得这毫无意义。有什么想法吗?

以下是 /etc/apache2/sites-enabled/000-default 的内容

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

以下是 /etc/apache2/sites-enabled/example.com 的内容:

    <VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com
    ServerAlias foo.com
    ServerAlias *.foo.com
    ServerAlias bar.com
    ServerAlias *.bar.com
    #... and a few others
    DocumentRoot /srv/www/example.com/public_html
    ErrorLog /srv/www/example.com/error.log
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel notice
    CustomLog /srv/www/example.com/access.log combined

      <Directory /srv/www/example.com/public_html>
        Options FollowSymLinks
        AllowOverride All
      </Directory>

    </VirtualHost>

我不明白为什么使用裸服务器名时,默认虚拟主机优先于与服务器名称明确匹配的虚拟主机,而所有别名都能正常工作。

以下是 # apache2ctl -S 的输出

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443                  is a NameVirtualHost
     default server example.com (/etc/apache2/sites-enabled/default-ssl:2)
     port 443 namevhost example.com (/etc/apache2/sites-enabled/default-ssl:2)
*:80                   is a NameVirtualHost
     default server example.com (/etc/apache2/sites-enabled/000-default:1)
     port 80 namevhost example.com (/etc/apache2/sites-enabled/000-default:1)
     port 80 namevhost example.com (/etc/apache2/sites-enabled/example.com:1)
Syntax OK

(我想不用说,我已经用“example.com”、“foo.com”和“bar.com”替换了实际域名,只是为了在 SF 上发布)

答案1

/etc/apache2/sites-enabled/ 中还链接了哪些其他文件?

通常,出于诊断目的,启用 mod-info 很有用,例如(来自http://httpd.apache.org/docs/2.2/mod/mod_info.html):

<Location /server-info>
  SetHandler server-info
</Location>

<Location /server-info>
  SetHandler server-info
  Order deny,allow
  Deny from all
  Allow from yourcompany.com
</Location> 

通常我会使用证书来确保安全,但这超出了我的解释范围。一旦您启用了该功能,并将其限制为 127.0.0.1(使用 ssh 隧道连接到服务器,设置您的主机文件等)。您可以看到 Apache 解析的确切运行配置。您可能会看到 example.com 在其他地方被引用。当您使用 mod-info 查看时,事情通常会更有意义。

答案2

显然,文档对此并不清楚。

https://issues.apache.org/bugzilla/show_bug.cgi?id=57384

“如果省略 ServerName [在虚拟主机定义中],则它是根据系统主机名计算得出的(对系统主机名进行双反向 DNS 查找)”。因此,如果启用的站点 000-default 没有服务器名称,则它就像将 example.com 作为 ServerName 一样,example.com 是我的服务器的主机名。

因此,就我而言,当客户端请求域 example.com 时,000-default 是第一个与请求的主机名匹配的服务器,并“捕获”该请求。

如果我想(就像我所做的那样)让默认站点捕获所有不匹配任何服务器名称的请求,我需要在默认 VirtualHost 定义中指定一个虚拟的 ServerName。这样,对服务器主机名的请求将不会匹配默认虚拟主机,但它们将匹配 example.com 虚拟主机。不匹配任何服务器名称或别名的请求将被默认站点捕获,因为它是第一个。

“即使您指定了服务器名称,第一个列出的虚拟主机也会捕获与服务器名称/服务器别名不匹配的任何内容。”

相关内容