Apache-2.2

Apache虛擬主機奇怪的行為

  • April 12, 2013

我有多個域通過 A-Record 連結到我的伺服器。我為他們所有人創建了一個虛擬主機。其中一些執行有和沒有 www。有些有額外的子域,有些有萬用字元(子)域。一切都執行得很好,除了一件事。

當我使用伺服器 ip 地址瀏覽到我的伺服器時,我沒有訪問預設主機 (/var/www),而是訪問其他虛擬主機之一。這是因為 IP 地址不匹配任何虛擬主機,然後將使用按字母順序首先定義的虛擬主機。到目前為止,好的。

但現在我不希望 IP 地址與預設主機匹配,而不是其他虛擬主機。所以我將“預設”虛擬主機文件重命名為“aaa-default”。一切執行良好。直接 ip 訪問與預設主機匹配。除一個之外,所有其他域都與它們的虛擬主機匹配。

域 code-bude.net 的虛擬主機非常適合所有情況,除了沒有 www 的訪問。

問題/問題 但是,當預設命名為預設http://code-bude.net時有效。那麼為什麼它不起作用,當預設是第一個主機時呢?

注意:目前 default 被命名為 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”虛擬主機文件:

<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 webmaster@code-bude.net
   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 kontakt@blitzartig.net
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 預設命名為預設時的輸出:

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

我懂了。ServerName您的 default中沒有指令<VirtualHost>。它需要有一個ServerName, 或者會為其生成一個(從主配置繼承或通過反向 DNS 查找猜測)。請注意,這不會與www名稱產生衝突,因為它只是優先考慮確切的名稱。

只要給它一些廢話ServerName catchall,它就會停止接受綁定的請求code-bude.net

當你像我一樣設置你的 apache 配置時,當沒有找到與 ServerName 匹配時,它會承載第一個 VirtualHost 聲明。

apache 將服務的網站由瀏覽器 HOST 標頭定義。

/etc/apache2/sites-enabled/000-default

<VirtualHost *:80>
   ServerAdmin admin@alpha.com
   ServerName www.alpha.com
   DocumentRoot /var/www/alpha.com
</VirtualHost>  

<VirtualHost *:80>
   ServerAdmin beta@def.com
   ServerName www.beta.com
   DocumentRoot /var/www/beta.com
</VirtualHost>  


<VirtualHost *:80>
   ServerAdmin admin@charlie.com
   ServerName www.charlie.com
   DocumentRoot /var/www/charlie.com
</VirtualHost> 

如果您的 ip 是靜態的,您可以覆蓋預設站點,這很可能是靜態的。假設您的 ip 是 8.8.8.8

添加以下 VirtualHost 以在通過 ip 訪問伺服器時提供新配置。

<VirtualHost *:80>
   ServerAdmin admin@somedomain.com
   ServerName 8.8.8.8
   DocumentRoot /var/www/somedomain.com
</VirtualHost>   

這可能是另一個配置的重複。

以下內容尚未經過測試,但應該具有相同的功能。假設您希望 www.beta.com 在通過 ip 訪問時成為預設站點。在您的 ip 再次假定為 8.8.8.8 的位置插入一個 ServerAlias

<VirtualHost *:80>
   ServerAdmin admin@beta.com
   ServerName www.beta.com
   ServerAlias 8.8.8.8
   DocumentRoot /var/www/beta.com
</VirtualHost>  

我希望這能回答你的問題,我不熟悉你用來設置 apache 伺服器的方法。這是我使用的設置。

引用自:https://serverfault.com/questions/498525