- 當多個server block時,server name匹配順序為:
- 完全符合的server_name,意味裡面沒有萬用字元*
- 以星號起始的server_name
- 以星號結尾的server_name
- 第一個符合正則表達式的server_name(第一個是由在nginx.conf中的順序決定)
- 萬用字元:
- 萬用字元只能在起始或結束,只能有一個,例如*.dom.tw或www.dom.*。
- www.*.dom.tw、w*.dom.tw都是錯的
- 如果要做到上面的,應該用正則表達式搞定,分別是www\..+\.dom\.tw及w.*\.dom\.tw
- *可以匹配多個節,*.example.org ”不僅匹配www.example.org,也匹配www.sub.example.org
- .example.org 的特殊萬用字元,它可以既匹配確切的名字example.org,又可以匹配一般的萬用字元名字 *.example.org
- 正則表達式
- 由開始,類似js中的\\
- 最好是記得用開頭&結尾,不然邏輯有問題(這點我也還沒搞懂為什麼必要)
- 有{}的正則前後要加上"",不然會報錯。例如 server_name "(?<name>\w\d { 1,3 } +)\.example\.net";
命名的正則表達式捕獲組在後面可以作為變量使用:
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 ;
}
}
文章標籤
全站熱搜
