轉自:http://www.sklinux.com/373php
nginx中的server_name指令主要用於配置基於名稱虛擬主機.html
一 匹配順序,server_name指令在接到請求後的匹配順序以下:linux
一、確切的server_name匹配,例如:nginx
server { listen 80; server_name www.sklinux.com sklinux.com; ... }
二、以*通配符開始的最長字符串:正則表達式
server { listen 80; server_name *.sklinux.com; ... }
三、以*通配符結束的最長字符串:dom
server { listen 80; server_name www.*; ... }
注意: 通配符名字只能夠在名字的起始處或結尾處包含一個星號,而且星號與其餘字符之間用點分隔。因此,「www.*.example.org
」和「w*.example.org
」都是非法的。post
有一種形 如「.example.org
」的特殊通配符,它能夠既匹配確切的名字「example.org
」,又能夠匹配通常的通配符名字「*.example.org
」。學習
四、匹配正則表達式:網站
server { listen 80; server_name ~^(?<www>.+)\.sklinux\.com$; ... }
nginx將按照1,2,3,4順序對server name進行匹配(而和配置段自己的排版順序無關),只要有一項匹配之後就會中止搜索。google
二。 server_name指令的正則表達式應用
server_name指令一項很實用的功能即是能夠在使用正則表達式的捕獲功能.nginx使用的正則表達式兼容PCRE。
爲了使用正則表達式,虛擬主機名必須以波浪線「~」起始不然該名字會被認爲是個確切的名字:
server_name ~^www\d+\.example\.net$;
若是表達式含星號,則會被認爲是個通配符名字(並且極可能是一個非法的通配符名字)。不要忘記設置「^
」和「$
」錨點,
語法上它們不是必須的,可是邏輯上是的。同時須要注意的是,域 名中的點「.」須要用反斜線「\」轉義。含有「{
」和「}
」的正則
表達式須要被引用,如:
server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";
不然nginx就不能啓動,錯誤提示是:
directive "server_name" is not terminated by ";" in ...
命名的正則表達式捕獲組在後面能夠做爲變量使用:
server { server_name ~^(www\.)?(?<domain>.+)$; location / { root /sites/$domain; } }
PCRE使用下面語法支持命名捕獲組:
?<
name
>從PCRE-7.0開始支持,兼容Perl 5.10語法 ?'
name
'從PCRE-7.0開始支持,兼容Perl 5.10語法 ?P<
name
>從PCRE-4.0開始支持,兼容Python語法
若是nginx不能啓動,並顯示錯誤信息:
pcre_compile() failed: unrecognized character after (?< in ...
說明PCRE版本太舊,應該嘗試使用?P<name>
。捕獲組也能夠以數字方式引用:
server { server_name ~^(www\.)?(.+)$; location / { root /sites/$2; } }
不過,這種用法只限於簡單的狀況(好比上面的例子),由於數字引用很容易被覆蓋。
下面是2個具體的應用:
1. 在一個server塊中配置多個站點
server { listen 80; server_name ~^(www\.)?(.+)$; index index.php index.html; root /data/wwwsite/$2; }
站點的主目錄應該相似於下面的結構,這樣就能夠只使用一個server塊來完成多個站點的配置。
/data/wwwsite/sklinux.com /data/wwwsite/baidu.com /data/wwwsite/sina.com /data/wwwsite/google.com
本例中正則表達式捕獲組建立了變量,普通的正則表達式捕獲組能夠建立$0、$一、…、$9這10個變量。$0表示原串,$1-$9表示第一到第九個匹配組的內容。
2. 在一個server塊中爲一個站點配置多個二級域名
實際網站目錄結構中咱們一般會爲站點的二級域名獨立建立一個目錄,一樣咱們可使用正則的捕獲來實如今一個server塊中配置多個二級域名:
server { listen 80; server_name ~^(.+)?\.sklinux\.com$; index index.html; if ($host = sklinux.com){ rewrite ^ http://www.sklinux.com permanent; } root /data/wwwsite/sklinux.com/$1/; }
站點的目錄結構應該以下:
/data/wwwsite/sklinux.com/www/ /data/wwwsite/sklinux.com/nginx/
這樣Root目錄和目標HOST地址的對應關係以下:
http://www.sklinux.com <--> /data/wwwsite/sklinux.com/www/ http://nginx.sklinux.com <--> /data/wwwsite/sklinux.com/nginx/
後面if語句的做用是將sklinux.com的方位重定向到http://www.sklinux.com,這樣既解決了網站的主目錄訪問,又能夠增長seo中對http://www.sklinux.com的域名權重。
3.多個正則表達式
若是你在server_name中用了正則,而下面的location字段又使用了正則匹配,這樣將沒法使用$1,$2這樣的引用,解決方法是經過set指令將其賦值給一個命名的變量:
server { listen 80; server_name ~^(.+)?\.sklinux\.com$; set $www_root $1; root /data/wwwsite/sklinux.com/$www_root/; location ~ .*\.php?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/wwwsite/sklinux.com/$fastcgi_script_name; include fastcgi_params; } }