天天看點

Nginx技巧:靈活的server_name,Nginx配置一個伺服器多個站點 和 一個站點多個二級域名

http://www.cnblogs.com/buffer/archive/2011/08/17/2143514.html

Nginx強大的正規表達式支援,可以使server_name的配置變得很靈活,如果你要做多使用者部落格,那麼每個使用者擁有自己的二級域名也就很容易實作了。

下面我就來說說server_name的使用吧:

server_name的比對順序

nginx中的server_name指令主要用于配置基于名稱虛拟主機,server_name指令在接到請求後的比對順序分别為:

1、準确的server_name比對,例如:

<code>server { listen 80; server_name ssdr.info www.ssdr.info; ... }</code>

2、以*通配符開始的字元串:

<code>server { listen 80; server_name *.ssdr.info; ... }</code>

3、以*通配符結束的字元串:

<code>server { listen 80; server_name www.*; ... }</code>

4、比對正規表達式:

<code>server { listen 80; server_name ~^(?.+)\.howtocn\.org$; ... }</code>

nginx将按照1,2,3,4的順序對server name進行比對,隻有有一項比對以後就會停止搜尋,是以我們在使用這個指令的時候一定要厘清楚它的比對順序(類似于location指令)。

server_name指令一項很實用的功能便是可以在使用正規表達式的捕獲功能,這樣可以盡量精簡配置檔案,畢竟太長的配置檔案日常維護也很不友善。下面是2個具體的應用:

在一個server塊中配置多個站點

<code>server { listen 80; server_name ~^(www\.)?(.+)$; index index.php index.html; root /data/wwwsite/$2; }</code>

站點的主目錄應該類似于這樣的結構:

<code>/data/wwwsite/ssdr.info /data/wwwsite/linuxtone.org /data/wwwsite/baidu.com /data/wwwsite/google.com</code>

這樣就可以隻使用一個server塊來完成多個站點的配置。

在一個server塊中為一個站點配置多個二級域名

實際網站目錄結構中我們通常會為站點的二級域名獨立建立一個目錄,同樣我們可以使用正則的捕獲來實作在一個server塊中配置多個二級域名:

<code>server { listen 80; server_name ~^(.+)?\.howtocn\.org$; index index.html; if ($host = ssdr.info){ rewrite ^ http://www.ssdr.info permanent; } root /data/wwwsite/ssdr.info/$1/; }</code>

站點的目錄結構應該如下:

<code>/data/wwwsite/ssdr.info/www/ /data/wwwsite/ssdr.info/nginx/</code>

這樣通路www.ssdr.info時root目錄為/data/wwwsite/ssdr.info/www/,nginx.ssdr.info時為/data/wwwsite/ssdr.info/nginx/,以此類推。

後面if語句的作用是将ssdr.info的方位重定向到www.ssdr.info,這樣既解決了網站的主目錄通路,又可以增加seo中對www.ssdr.info的域名權重。

多個正規表達式

如果你在server_name中用了正則,而下面的location字段又使用了正則比對,這樣将無法使用$1,$2這樣的引用,解決方法是通過set指令将其指派給一個命名的變量:

<code>server { listen 80; server_name ~^(.+)?\.howtocn\.org$; set $www_root $1; root /data/wwwsite/ssdr.info/$www_root/; location ~ .*\.php?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/wwwsite/ssdr.info/$fastcgi_script_name; include fastcgi_params; } }</code>