+++++++++++手冊官網纔是王道+++++++++
摘自apche的幫助手冊:
apache 配置虛擬主機
基於IP的虛擬主機使用連接的IP地址來決定相應的虛擬主機。這樣,你就需要爲每個虛擬主機分配一個獨立的IP地址。而基於域名的虛擬主機是根據客戶端提交的HTTP頭中標識主機名的部分決定的。使用這種技術,很多虛擬主機可以共享同一個IP地址。
基於域名的虛擬主機相對比較簡單,因爲你只需要配置你的DNS服務器將每個主機名映射到正確的IP地址,然後配置Apache HTTP服務器,令其辨識不同的主機名就可以了。基於域名的服務器也可以緩解IP地址不足的問題。所以,如果沒有特殊原因使你必須使用基於IP的虛擬主機,您最好還是使用基於域名的虛擬主機。下列情況下,你可能會想要使用基於IP的虛擬主機:
- 一些古董級的客戶端與基於域名的虛擬主機不兼容。爲了與基於域名的虛擬主機兼容,客戶端必須發送"Host"頭。HTTP/1.1規範中對此做了要求。而所有現在常見的僅支持HTTP/1.0的舊版本瀏覽器都以附加的方式實現了這個要求。如果你又想支持這些老瀏覽器,又想使用基於域名的虛擬主機。我們提供了一個技術方案,你可以在本文末尾看到它。
- SSL協議先天特性決定了基於域名的虛擬主機無法成爲SSL安全服務器。
- 一些操作系統和網絡設備實現的帶寬管理技術無法在多個主機共享一個IP的情況下區別它們。
相關模塊 | 相關指令 |
---|---|
爲了使用基於域名的虛擬主機,你必須指定服務器IP地址(和可能的端口)來使主機接受請求,這個可以用
NameVirtualHost
指令來進行配置。如果服務器上所有的IP地址都會用到,你可以用"*
"作爲NameVirtualHost
的參數。如果你打算使用多端口(如運行SSL)你必須在參數中指定一個端口號,比如"*:80
"。請注意,在NameVirtualHost
指令中指定IP地址並不會使服務器自動偵聽那個IP地址。請參閱設置Apache使用的地址和端口一章獲取更多詳情。另外,這裏設定的IP地址必須對應服務器上的一個網絡接口。下一步就是爲每個虛擬主機建立
<VirtualHost>
段。<VirtualHost>
的參數與NameVirtualHost
的參數必須是一樣的(比如說,一個IP地址或"*
"代表的所有地址)。在每個<VirtualHost>
段中,至少要有一個ServerName
指令來指定伺服哪個主機和一個DocumentRoot
指令來說明這個主機的內容位於文件系統的什麼地方。取消中心主機(Mainhost)
如果你想在現有的web服務器上增加虛擬主機,你必須也爲現存的主機建造一個
<VirtualHost>
定義塊。這個虛擬主機中ServerName
和DocumentRoot
所包含的內容應該與全局的ServerName
和DocumentRoot
保持一致。還要把這個虛擬主機放在配置文件的最前面,來讓它扮演默認主機的角色。比如說,假設你正在爲域名
www.domain.tld
提供服務,而你又想在同一個IP地址上增加一個名叫www.otherdomain.tld
的虛擬主機,你只需在httpd.conf
中加入以下內容:————————————————————————————
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>
<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>
—————————————————————————————
當然,你可以用一個固定的IP地址來代替
NameVirtualHost
和<VirtualHost>
指令中的"*
"號,以達到一些特定的目的。比如說,你可能會希望在一個IP地址上運行一個基於域名的虛擬主機,而在另外一個IP地址上運行一個基於IP的或是另外一套基於域名的虛擬主機。很多服務器希望自己能通過不只一個域名被訪問。我們可以把
ServerAlias
指令放入<VirtualHost>
小節中來解決這個問題。比如說在上面的第一個<VirtualHost>
配置段中ServerAlias
指令中列出的名字就是用戶可以用來訪問同一個web站點的其它名字:ServerAlias domain.tld *.domain.tld
這樣,所有對域
domain.tld
的訪問請求都將由虛擬主機www.domain.tld
處理。通配符標記"*
"和"?
"可以用於域名的匹配。當然你不能僅僅搞個名字然後把它放到ServerName
或ServerAlias
裏就算完了。你必須先在你的DNS服務器上進行配置,將這些名字和您服務器上的一個IP地址建立映射關係。最後,你可以把其他一些指令放入
<VirtualHost>
段中,以更好的配置一個虛擬主機。大部分指令都可以放入這些<VirtualHost>
段中以改變相應虛擬主機配置。如果您想了解一個特定的指令是否可以這樣運用,請參見指令的作用域。主服務器(main server)範圍內的配置指令(在所有<VirtualHost>
配置段之外的指令)僅在它們沒有被虛擬主機的配置覆蓋時才起作用。這樣,當一個請求到達的時候,服務器會首先檢查它是否使用了一個能和
NameVirtualHost
相匹配的IP地址。如果能夠匹配,它就會查找每個與這個IP地址相對應的<VirtualHost>
段,並嘗試找出一個與請求的主機名相同的ServerName
或ServerAlias
配置項。如果找到了,它就會使用這個服務器。否則,將使用符合這個IP地址的第一個列出的虛擬主機。綜上所述,第一個列出的虛擬主機充當了默認虛擬主機的角色。當一個IP地址與
NameVirtualHost
指令中的配置相符的時候,主服務器中的DocumentRoot
將永遠不會被用到。所以,如果你想創建一段特殊的配置用於處理不對應任何一個虛擬主機的請求的話,你只要簡單的把這段配置放到<VirtualHost>
段中,並把它放到配置文件的最前面就可以了。--------————————————————————
我的配置例:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName localhost
DocumentRoot e:\wamp\www
</VirtualHost>
<VirtualHost *:80>
ServerName www.test.com
DocumentRoot e:\wamp\www\mypro/test
</VirtualHost>
<VirtualHost *:80>
ServerName localhost
DocumentRoot e:\wamp\www
</VirtualHost>
<VirtualHost *:80>
ServerName www.test.com
DocumentRoot e:\wamp\www\mypro/test
</VirtualHost>
<VirtualHost *:80>
ServerName test.my.cn
DocumentRoot d:/wamp/www/my.cn/test/
RewriteEngine On
RewriteRule ^/$ /col/6/index.html [L]
RewriteRule ^/index.html$ /col/6/index.html [L]
</VirtualHost>
RewriteRule ^/index.html$ /col/6/index.html [L]
</VirtualHost>
--------————————————————————
注意:1.hosts添加域名時,不要寫太長 ,如 127.0.0.1www.aa.cn www.bb.cn www.cc.cn..........., 有時候後面的無法解析,
可以拆分多條:127.0.0.1 www.aa.cn www.bb.cn
127.0.0.1 www.cc.cn www.dd.cn 等。
2.有需要重定向的域名時,確保httpd.conf中的LoadModule rewrite_module modules/mod_rewrite.so沒有被#註釋掉。
--------————————————————————