nginx 配置的server_name參數


nginx中的server_name指令主要用於配置基於名稱虛擬主機.

一 匹配順序,server_name指令在接到請求后的匹配順序如下:

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

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

 

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

 

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

 

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

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

      注意: 通配符名字只可以在名字的起始處或結尾處包含一個星號,並且星號與其他字符之間用點分隔。所以,“www.*.example.org”和“w*.example.org”都是非法的。

              有一種形  如“.example.org”的特殊通配符,它可以既匹配確切的名字“example.org”,又可以匹配一般的通配符名字“*.example.org”。

4、匹配正則表達式:

server {
    listen       80;
    server_name  ~^(?<www>.+)\.sklinux\.com$;
    ...
}

 

    nginx將按照1,2,3,4順序對server name進行匹配(而和配置段本身的排版順序無關),只要有一項匹配以后就會停止搜索。

二。 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、$1、…、$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;
         }
   }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM