需求:好比用戶有一個二級域名test.test.com和一個頂級域名try.com,只有一臺主機一個ip,怎樣實現使用test.test.com訪問的是主機的/data/www/test下的內容,使用try.com訪問的是/data/www/try下面的內容。html
1. 最簡單的轉發linux
修改httpd.conf(通常是/etc/httpd/conf/httpd.conf),首先下面兩行若是被用#註釋掉了就去掉#讓其生效:
# 確保Apache在監聽80端口
Listen 80
# 爲虛擬主機在全部IP地址上監聽
NameVirtualHost *:80url
接着添加下面的語句:
spa
<VirtualHost *:80>
DocumentRoot /data/www/test
ServerName test.test.com
</VirtualHost>htm
<VirtualHost *:80>
DocumentRoot /data/www/try
ServerName try.com
</VirtualHost>ip
2. 讓www.try.com也能訪問
get
這樣完了嗎?沒完,使用www.try.com訪問會驚奇的發現,居然內容和test.test.com同樣,這是爲何呢?由於這個配置文件之中越前面的優先級越高,若是沒有匹配的,則以第一條爲準,因而www.try.com就訪問到/data/www/test目錄去了。域名
解決辦法就是添加這樣一句:
it
<VirtualHost *:80>
DocumentRoot /data/www/try
ServerName www.try.com
</VirtualHost>test
3. 錯誤的url應該有提示
這回使用www.try.com訪問的是try.com的內容了,可是還沒完,你使用www2.try.com試試,又跑去/data/www/test目錄了!
好吧,咱們在最前面添加這樣一條:
<VirtualHost *:80>
DocumentRoot /data/www/default
</VirtualHost>
而後在default目錄下放一個index.html文件提示url錯誤
這樣使用www2.try.com或是其餘任何無效的url好比fuck.try.com等等就能夠被引到/data/www/default目錄去了。
4. 不一樣的Url有不一樣的錯誤頁面
ok,如今咱們有有新的要求了,假設咱們有一個二級域名test.test.com,兩個頂級域名try.com和example.com,按照上面的規則,咱們的http.conf應該這樣配置:
<VirtualHost *:80>
DocumentRoot /data/www/default
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/test
ServerName test.test.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/try
ServerName try.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/try
ServerName www.try.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/example
ServerName example.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/example
ServerName www.example.com
</VirtualHost>
看似可以知足要求,咱們用test.test.com訪問的是/data/www/test,用www.try.com和try.com訪問的內容是/data/www/try,用www.example.com和example.com訪問的是/data/www/example
可是,還有一個問題,fuck.try.com訪問的是/data/www/default,而fuck.example.com訪問的也是/data/www/default!這怎麼能行呢?若是咱們在default下面設置的錯誤頁面內容是「頁面找不到,點我返回www.try.com」,同時一點按鈕能夠回到www.try.com首頁,對於訪問到fuck.try.com的無知遊客來講,這也許是個能起到做用的錯誤頁面,可是對於那些訪問到fuck.example.com的用戶來講,也顯示什麼「返回到www.try.com」就有些莫名其妙了。
也就是說這時候咱們的需求是爲每個域名設置一個單獨的錯誤頁面。
因而咱們須要用到ServerAlias這個字段,按照以下的方法設置http.conf:
DocumentRoot /data/www/test
ServerName test.test.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/try
ServerName try.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/try
ServerName www.try.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/try/error
ServerName *.try.com
ServerAlias *.try.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/example
ServerName example.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/example
ServerName www.example.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/www/example/error
ServerName *.example.com
ServerAlias *.example.com
</VirtualHost>
注意藍字的地方是咱們新加的,並且咱們去掉了本來轉發到/data/www/default的那一條,由於沒用了。紅字的地方和以前的規則相比多了ServerAlias,能夠使用通配符匹配多個域名,ServerAlias *.try.com即表示相似fuck.try.com、shit.try.com、damn.try.com都會匹配到這條規則(注意相似ServerAlias *.try.com的規則必定要放在同域名的規則的最後一條,若是放在前面,全部對該域名的訪問都會按照該規則來轉發了),經過這樣的設定,fuck.try.com會被轉發到/data/www/try/error,而fuck.example.com會被轉發到/data/www/example/error,這樣就作到了不一樣的域名錯誤頁面也不一樣。
final. 使用ip能夠訪問到/data/www
最後,咱們加上一條規則,當使用ip訪問的時候能夠訪問到/data/www,假設咱們的ip是127.0.0.1,那麼127.0.0.1/try訪問的就是/data/www/try,127.0.0.1/example訪問的就是/data/www/example,一個主機綁定不少域名的時候,用這種管理上仍是比較方便的,要作到這一點,咱們只須要加上這麼一條:
<VirtualHost *:80>
DocumentRoot /data/www
ServerName 127.0.0.1
</VirtualHost>
參考連接以下:
http://lamp.linux.gov.cn/Apache/ApacheMenu/vhosts/examples.html