Apache虛擬主機奇怪的行為
我有多個域通過 A-Record 連結到我的伺服器。我為他們所有人創建了一個虛擬主機。其中一些執行有和沒有 www。有些有額外的子域,有些有萬用字元(子)域。一切都執行得很好,除了一件事。
當我使用伺服器 ip 地址瀏覽到我的伺服器時,我沒有訪問預設主機 (/var/www),而是訪問其他虛擬主機之一。這是因為 IP 地址不匹配任何虛擬主機,然後將使用按字母順序首先定義的虛擬主機。到目前為止,好的。
但現在我不希望 IP 地址與預設主機匹配,而不是其他虛擬主機。所以我將“預設”虛擬主機文件重命名為“aaa-default”。一切執行良好。直接 ip 訪問與預設主機匹配。除一個之外,所有其他域都與它們的虛擬主機匹配。
域 code-bude.net 的虛擬主機非常適合所有情況,除了沒有 www 的訪問。
- http://www.code-bude.net -> 作品
- http://admin.code-bude.net -> 作品
- http://code-bude.net -> 不起作用
問題/問題 但是,當預設命名為預設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 伺服器的方法。這是我使用的設置。