Nginx中的server_name指令主要用於配置基於名稱的虛擬主機,server_name指令在接到請求後的匹配順序分別爲:php
一、準確的server_name匹配,例如:html
server {
listen 80;
server_name domain.com www.domain.com;
...
}
二、以*通配符開始的字符串:nginx
server {
listen 80;
server_name *.domain.com;
...
}
三、以*通配符結束的字符串:正則表達式
server {
listen 80;
server_name www.*;
...
}
四、匹配正則表達式:dom
server { listen 80; server_name ~^(?.+)\.domain\.com$;
...
}
nginx將按照1,2,3,4的順序對server name進行匹配,只有有一項匹配之後就會中止搜索,因此咱們在使用這個指令的時候必定要分清楚它的匹配順序(相似於location指令)。
server_name指令一項很實用的功能即是能夠在使用正則表達式的捕獲功能,這樣能夠儘可能精簡配置文件,畢竟太長的配置文件平常維護也很不方便。下面是2個具體的應用:
一、在一個server塊中配置多個站點:
server
{
listen 80;
server_name ~^(www\.)?(.+)$;
index index.php index.html;
root /data/wwwsite/$2;
}
站點的主目錄應該相似於這樣的結構:ide
/data/wwwsite/domain.com
/data/wwwsite/nginx.org
/data/wwwsite/baidu.com
/data/wwwsite/google.com
這樣就能夠只使用一個server塊來完成多個站點的配置。網站
二、在一個server塊中爲一個站點配置多個二級域名。google
實際網站目錄結構中咱們一般會爲站點的二級域名獨立建立一個目錄,一樣咱們可使用正則的捕獲來實如今一個server塊中配置多個二級域名:spa
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/;
}
站點的目錄結構應該以下:orm
/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的域名權重。