Wednesday, April 17, 2024

Nginx在server_name中使用正則表達式

Nginx有一項功能就是可以在server_name中使用正則表達式並引用,這個功能比較實用,可以精簡不少冗餘配置文件:

Nginx中的server_name指令主要用於配置基於名稱的虛擬主機,server_name指令在接到請求後的匹配順序分別為:

1、準確的server_name匹配,例如:

server {
     listen       80;
     server_name  qiaodahai.com  www.qiaodahai.com;
     ...
}

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

server {
     listen       80;
     server_name  *.qiaodahai.com;
     ...
}

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

server {
     listen       80;
     server_name  www.*;
     ...
}

4、匹配正則表達式:

server {
     listen       80;
     server_name  ~^(?.+).qiaodahai.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/qiaodahai.com
/data/wwwsite/nginx.org
/data/wwwsite/baidu.com
/data/wwwsite/google.com

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

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

server
   {
     listen       80;
     server_name  ~^(.+)?.qiaodahai.com$;
     index index.html;
     if ($host = qiaodahai.com){
         rewrite ^ http://www.qiaodahai.com permanent;
     }
     root  /data/wwwsite/qiaodahai.com/$1/;
   }

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

/data/wwwsite/qiaodahai.com/www/
/data/wwwsite/qiaodahai.com/nginx/

這樣訪問www.qiaodahai.com時root目錄為/data/wwwsite/qiaodahai.com/www/,nginx.qiaodahai.com時為/data/wwwsite/qiaodahai.com/nginx/,以此類推。
後面if語句的作用是將qiaodahai.com的方位重定向到www.qiaodahai.com,這樣既解決了網站的主目錄訪問,又可以增加seo中對www.qiaodahai.com的域名權重。

參考資料:http://nginx.org/

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.