Nginx技巧:靈活的server_name

Nginx技巧:靈活的server_name

 

Nginx強大的正則表達式支持,可以使server_name的配置變得很靈活,如果你要做多用戶博客,那麼每個用戶擁有自己的二級域名也就很容易實現了。
下面我就來說說server_name的使用吧:
server_name的匹配順序
nginx中的server_name指令主要用於配置基於名稱虛擬主機,server_name指令在接到請求後的匹配順序分別爲:
1、準確的server_name匹配,例如:
server {
listen 80;
server_name ssdr.info www.ssdr.info;
...
}

2、以*通配符開始的字符串:
server {
listen 80;
server_name *.ssdr.info;
...
}

3、以*通配符結束的字符串:
server {
listen 80;
server_name www.*;
...
}

4、匹配正則表達式:
server {
listen 80;
server_name ~^(?.+)\.howtocn\.org$;
...
}

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;
}

站點的主目錄應該類似於這樣的結構:
/data/wwwsite/ssdr.info
/data/wwwsite/linuxtone.org
/data/wwwsite/baidu.com
/data/wwwsite/google.com

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

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

實際網站目錄結構中我們通常會爲站點的二級域名獨立創建一個目錄,同樣我們可以使用正則的捕獲來實現在一個server塊中配置多個二級域名:
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/;
}

站點的目錄結構應該如下:
/data/wwwsite/ssdr.info/www/
/data/wwwsite/ssdr.info/nginx/

這樣訪問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指令將其賦值給一個命名的變量:
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;
}
}

 
標籤: nginx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章