
我想知道之間的區別」預設:*” 和 “*:*”在虛擬主機上下文中。
<VirtualHost _default_:*>
#...
ServerName host.example.com
#...
</VirtualHost>
<VirtualHost *:*>
#...
ServerName host.example.com
#...
</VirtualHost>
我不知道差別和用途。
Thk
答案1
解決方案位於 Apache 2.2 文件中關於虛擬主機指令:
文法:... (...) 地址可以是:
- 虛擬主機的IP位址;
- 虛擬主機 IP 位址的完全限定網域名稱(不建議);
- 人物 *,僅與以下組合使用名稱虛擬主機* 符合所有IP位址;或者
- 字串_預設_,僅與IP虛擬主機捕獲不匹配的 IP 位址。
有兩種處理虛擬主機的方法:基於名稱的虛擬主機和基於 IP 的虛擬主機。
使用基於命名的虛擬主機,您有一個虛擬主機列表,每個虛擬主機管理一個或多個域名,並且每個虛擬主機與幾個listening IP:port
.*
是一個特殊的值,這意味著該主機上的所有IP。對於每個給定的偵聽位址,預設的 virtualHost 是該清單中第一個聲明的虛擬主機。
對於基於 IPServerName
的 VirtualHosts,不使用 VirtualHost 指令,重要資訊是偵聽 IP(和連接埠),預設 VirtualHost 是第一個與處理傳入請求的 IP 相符的 VirtualHost。
因此,使用基於命名的虛擬主機配置:
<Virtualhost *:80> with ServerName foo.com
表示「在此主機上管理的所有 IP 上」、「在連接埠 80 上」、「如果請求主機標頭是 foo.com」我將使用此虛擬主機<Virtualhost *:*> with Servername foo.com
意思是“在此主機上管理的所有IP上”,“在所有連接埠上”,“如果請求主機標頭是foo.com”我將使用此虛擬主機<Virtualhost 10.0.0.2:*> with Servername foo.com
意味著「對於從我的網路介面 10.0.0.2 傳入的請求」、「在所有連接埠上」、「如果請求主機標頭是 foo.com」我將使用此虛擬主機<Virtualhost _default_:*> with Servername foo.com
:不應與基於名稱的虛擬主機一起使用
在基於 IP 的虛擬主機上:
<Virtualhost 10.0.0.2:*>
意思是“我將使用這個虛擬主機來處理來自我的 10.0.0.2 介面的請求”<Virtualhost _default_:443>
意思是“我將使用這個虛擬主機來處理主機上的所有其他網絡接口,以處理來自端口 443 的請求”<Virtualhost _default_:*>
意思是“如果我的主機上的所有其他網路介面與該虛擬主機不匹配,並且請求主機標頭與基於命名的虛擬主機不匹配,我將使用此虛擬主機”
所以這一切都是為了定義一個包羅萬象的虛擬主機。文件新增:
使用基於 IP 的虛擬主機時,可以指定特殊名稱,
_default_
在這種情況下,該虛擬主機將與另一個虛擬主機中未明確列出的任何 IP 位址相符。在沒有任何虛擬主機的情況下,_default_
當沒有發生 IP 匹配時,將使用由任何 VirtualHost 部分之外的所有這些定義組成的「主」伺服器配置。 (但請注意,任何與 NameVirtualHost 指令匹配的 IP 位址都不會使用「主」伺服器配置或_default_
虛擬主機。有關更多詳細信息,請參閱基於名稱的虛擬主機文件。)
因此,在經歷了所有這些事情之後,「很明顯」混合基於 IP 和基於名稱的虛擬主機可能會變得一團糟。對於 Apache 2.2,僅在NameVirtualhost <something>
使用時才使用基於名稱的虛擬主機。
但與新的阿帕契2.4版本這些東西確實比較容易理解,無需NameVirtualhost
聲明。除了發出警告之外,NameVirtualHost 指令不再有任何作用。在多個虛擬主機中出現的任何位址/連接埠組合都將隱式視為基於名稱的虛擬主機。沒有更複雜的想法,甚至連文件現在也更簡單了:
- 字元*,充當通配符並匹配任何IP 位址。
- 字串
_default_
,它是 * 的別名
所以對 apache 2.4 來說答案是,這是同一件事。
答案2
_default_
所有連接埠的虛擬主機
擷取對任何未指定的 IP 位址和連接埠(即未用於任何其他虛擬主機的位址/連接埠組合)的每個請求。
http://httpd.apache.org/docs/2.2/vhosts/examples.html#default