Apache 虚拟主机的奇怪行为

Apache 虚拟主机的奇怪行为

我有多个通过 A 记录链接到我的服务器的域名。我为它们创建了一个虚拟主机。其中一些域名在运行时带有或不带有 www。一些域名有额外的子域名,一些域名有通配符(子)域名。除了一件事外,所有域名都运行良好。

当我使用服务器 IP 地址访问我的服务器时,我没有访问默认主机 (/var/www),而是访问了其他虚拟主机之一。这是因为 IP 地址与任何虚拟主机都不匹配,因此将使用按字母顺序首先定义的虚拟主机。到目前为止,一切正常。

但现在我希望 IP 地址与默认主机匹配,而不是其他虚拟主机。所以我将“默认”虚拟主机文件重命名为“aaa-default”。一切运行正常。直接 IP 访问与默认主机匹配。除一个域外,所有其他域都与其虚拟主机匹配。

域名 code-bude.net 的 vhost 完美匹配所有情况,除了没有 www 的访问。

问题/疑问 但当默认被命名为默认http://code-bude.net有效。那么当默认主机是第一个主机时,为什么它不起作用呢?

注意:目前默认名为 default,否则我的博客 (code-bude.net) 将无法访问。如果您现在使用 ip (37.221.194.133) 访问服务器,您将看到它与 blitzartig.net 匹配,而不是默认服务器页面(如果您导航到 admin.code-bude.net,也会显示该页面)。

“aaa-default/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

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

“code-bude.net”vhost文件:

<VirtualHost *:80>
    ServerName admin.code-bude.net
    DocumentRoot /var/www
</VirtualHost>

<VirtualHost *:80>
    ServerName dev.code-bude.net
    DocumentRoot /var/www/dev
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName code-bude.net
    ServerAlias www.code-bude.net *.code-bude.net
    DocumentRoot /var/www/code-bude.net/public_html
    <Directory />
        Options FollowSymLinks
        AllowOverride All
    </Directory>
    <Directory /var/www/code-bude.net/public_html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        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

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

“blitzartig.net” vhost 文件(当默认值为 default 而不是 aaa-default 时,这是第一个文件):

<VirtualHost *:80>
ServerAdmin [email protected]
ServerName blitzartig.net
ServerAlias www.blitzartig.net
DocumentRoot /var/www/blitzartig.net/public_html
<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>
<Directory /var/www/blitzartig.net/public_html>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    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

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

apachectl -S 默认命名为 default 时的输出:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server code-bude.net (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost code-bude.net (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost blitzartig.net (/etc/apache2/sites-enabled/blitzartig.net:1)
         port 80 namevhost admin.code-bude.net (/etc/apache2/sites-enabled/code-bude.net:1)
         port 80 namevhost dev.code-bude.net (/etc/apache2/sites-enabled/code-bude.net:6)
         port 80 namevhost code-bude.net (/etc/apache2/sites-enabled/code-bude.net:11)
         port 80 namevhost derwirtschaftsinformatiker.de (/etc/apache2/sites-enabled/derwirtschaftsinformatiker.de:1)
         port 80 namevhost raffaelherrmann.de (/etc/apache2/sites-enabled/raffaelherrmann.de:1)
         port 80 namevhost wortkonstrukte.net (/etc/apache2/sites-enabled/wortkonstrukte.net:1)
Syntax OK

apachectl -S 默认命名为 aaa-default 时输出:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server code-bude.net (/etc/apache2/sites-enabled/aaa-default:1)
         port 80 namevhost code-bude.net (/etc/apache2/sites-enabled/aaa-default:1)
         port 80 namevhost blitzartig.net (/etc/apache2/sites-enabled/blitzartig.net:1)
         port 80 namevhost admin.code-bude.net (/etc/apache2/sites-enabled/code-bude.net:1)
         port 80 namevhost dev.code-bude.net (/etc/apache2/sites-enabled/code-bude.net:6)
         port 80 namevhost code-bude.net (/etc/apache2/sites-enabled/code-bude.net:11)
         port 80 namevhost derwirtschaftsinformatiker.de (/etc/apache2/sites-enabled/derwirtschaftsinformatiker.de:1)
         port 80 namevhost raffaelherrmann.de (/etc/apache2/sites-enabled/raffaelherrmann.de:1)
         port 80 namevhost wortkonstrukte.net (/etc/apache2/sites-enabled/wortkonstrukte.net:1)
Syntax OK

答案1

ServerName哦,我明白了。您的默认 中没有指令<VirtualHost>。它需要有一个ServerName,否则将为其生成一个(从主配置继承或通过反向 DNS 查找猜测)。请注意,这不会与名称产生冲突www,因为它只是优先于确切的名称。

只要给它一些无意义的东西ServerName catchall,它就会停止接受发往的请求code-bude.net

答案2

当您像我一样设置 apache 配置时,如果找不到与 ServerName 匹配的内容,它将托管第一个 VirtualHost 声明。apache
将提供服务的网站由浏览器 HOST 标头定义。

/etc/apache2/sites-enabled/000-默认

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName www.alpha.com
    DocumentRoot /var/www/alpha.com
</VirtualHost>  

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName www.beta.com
    DocumentRoot /var/www/beta.com
</VirtualHost>  


<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName www.charlie.com
    DocumentRoot /var/www/charlie.com
</VirtualHost> 

如果您的 IP 是静态的(很可能是静态的),您可以覆盖默认站点。假设您的 IP 是 8.8.8.8
添加以下 VirtualHost 以在通过 IP 访问服务器时提供新配置。

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName 8.8.8.8
    DocumentRoot /var/www/somedomain.com
</VirtualHost>   

这可能是另一个配置的重复。

以下内容尚未测试,但应该可以实现相同的功能。假设您希望 www.beta.com 成为通过 ip 访问时的默认站点。插入 ServerAlias,其中您的 ip 再次被假定为 8.8.8.8

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName www.beta.com
    ServerAlias 8.8.8.8
    DocumentRoot /var/www/beta.com
</VirtualHost>  

我希望这能回答您的问题,我不熟悉您设置 Apache 服务器的方法。这是我使用的设置。

相关内容