server_name指令可以設置基于域名的虛擬主機,根據請求頭部的內容,一個ip的服務器可以配置多個域名。下面這些server_name的參數是有效的:
1
2
3
4
5
6
7
8
9
10
11
|
server_name zzvips.com; server_name zzvips.com www.jfrwli.cn; server_name *.zzvips.com; server_name .zzvips.com; server_name nginx.*; server_name zzvips.com aspku.net brackley.org; server_name localhost litchfield bleddington; server_name ""; |
多個域名之間以空格分隔。nginx允許一個虛擬主機有一個或多個名字,也可以使用通配符"*"來設置虛擬主機的名字。上面的例子我們看到了很多特殊的地方:
第一組例子,首先定義server_name為zzvips.com,那么來自http://zzvips.com的請求就會發到該主機上。第二個例子配置了zzvips.com和www.jfrwli.cn,那么http://zzvips.com和//www.jfrwli.cn的請求會發到這個主機上。
*.zzvips.com和.zzvips.com是等同的配置,設置該主機處理所有來自zzvips.com的子域名,比如www.jfrwli.cn,blog.zzvips.com等
第二組server_name配置nginx.*,配置服務器處理所有以nginx.開頭的請求。例如,nginx.com,zzvips.com,nginx.net,nginx.baidu.com
接下來一組第一個server_name配置,設置主機處理來自三個域名的請求。nginx允許設置不是有效域名的名字。比如接下來這個配置我們可以看到三個不是有效域名的例子,localhost,litchfiled和bledington。nginx只查找請求的HTTP頭中的域名但并不判斷域名是否有效,這個例子中這些主機名可以配制在/etc/hosts中。當你在本機調試時使用非域名的主機名有時候更適合些。
最后一組例子,server_name設置為空的雙引號,它告訴nginx捕捉所有沒有hostname的請求,或者hostname沒有在其它server_name中指定的。
總結一下,server_name指令在接到請求后的匹配順序分別為:
1、準確的server_name匹配,例如:
1
|
server { listen 80; server_name domain.com www.domain.com; ...} |
2、以通配符開始的字符串:
1
|
server { listen 80; server_name .domain.com;...} |
3、以通配符結束的字符串:
1
|
server { listen 80; server_name www.; ...} |
4、匹配正則表達式:
1
|
server { listen 80; server_name ~^(?.+).domain.com$;...} |
nginx將按照1,2,3,4的順序對server name進行匹配,只有有一項匹配以后就會停止搜索,所以我們在使用這個指令的時候一定要分清楚它的匹配順序(類似于location指令)。
server_name指令一項很實用的功能便是可以在使用正則表達式的捕獲功能,這樣可以盡量精簡配置文件,畢竟太長的配置文件日常維護也很不方便。下面是2個具體的應用:
1、在一個server塊中配置多個站點:
server { listen 80; server_name ~^(www.)?(.+)$; index index.php index.html; root /data/wwwsite/$2; }
站點的主目錄應該類似于這樣的結構:
/data/wwwsite/domain.com/data/wwwsite/nginx.org/data/wwwsite/baidu.com/data/wwwsite/google.com
這樣就可以只使用一個server塊來完成多個站點的配置。
2、在一個server塊中為一個站點配置多個二級域名。
實際網站目錄結構中我們通常會為站點的二級域名獨立創建一個目錄,同樣我們可以使用正則的捕獲來實現在一個server塊中配置多個二級域名:
1
2
3
4
5
6
7
8
|
server { listen 80; server_name ~^(.+)?.domain.com$; index index.html; if ($host = domain.com){ rewrite ^ http://www.domain.com permanent; } root /data/wwwsite/domain.com/$1/;} |
站點的目錄結構應該如下:
1
|
/data/wwwsite/domain.com/www//data/wwwsite/domain.com/nginx/ |
這樣訪問www.domain.com時root目錄為/data/wwwsite/domain.com/www/,nginx.domain.com時為/data/wwwsite/domain.com/nginx/,以此類推。
后面if語句的作用是將domain.com的方位重定向到www.domain.com,這樣既解決了網站的主目錄訪問,又可以增加seo中對www.domain.com的域名權重。