4.nginx的server_name正則匹配


有了default_server,小張心里松了一口氣,不用擔心server_name寫錯而白跑一趟了。但是要是Nginx沒有設置default_server呢?
老王:”如果沒有設置,那么我們入口初開始,根據端口號8888找到的第一個就是默認default_server“。
_代表無效的域名,不會與任何真實的server_name相交。”“匹配沒有傳遞Host頭信息的請求。

    server {
        server_name "";
        # List port
        listen 9999;

        location / {
            return 200 $hostname;
        }
    }

返回結果:192.168.0.102,個人的ip地址。

還可以多個域名,ip,當然無法使用server_name來匹配所有的名稱,這是剛才講過的listen的屬性。

server {
    listen       80;
    server_name  wyc.com
                 www.wyc.com
                 ""
                 192.168.1.1
                 ;
    ...
}

原來還有這么多種方式,那么正則也講講吧。
表示區分大小寫的匹配,表示不區分大小寫的匹配正則表達式以^開始,$結束。點.代表除換行符以外的任意字符,\d匹配數字等。這些知識匹配一個字符或者數字,當匹配多個時,通過重復來解決,表示重復零次或者多次,+表示重復一次或者多次,?表示重復零次或者一次,{n}表示重復n次,{n,} 表示重復n次或者更多次,{n,m}表示重復n次到m次。

這種正則表達式還可以幫我們提取一些變量,用小括號表示(),多個小括號里提取出來的變量分別用$1,$2,$3...表示,也可以自定義一個值表示,問號加尖括號表示,如下,

server {
        server_name ~^(www\.)?(?<domain>.+)\.com$;
        # List port
        listen 8888;

        location / {
            return 200 $domain;
        }
    }

通過www.wyc.com:8888請求,$1表示www. 而domain的值是wyc。


附錄:
為區分大小寫的匹配
~* 不區分大小寫的匹配(匹配firefox的正則同時匹配FireFox)
!~ 區分大小寫不匹配
!~* 不區分大小寫不匹配
. 匹配除換行符以外的任意字符
\w 匹配字母或數字或下划線或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束
  • 重復零次或更多次前面一個字符
  • 重復一次或更多次前面一個字符
    ? 重復零次或一次前面一個字符
    {n} 重復n次前面一個字符{n,} 重復n次或更多次
    {n,m} 重復n到m次
    *? 重復任意次,但盡可能少重復
    +? 重復1次或更多次,但盡可能少重復
    ?? 重復0次或1次,但盡可能少重復{n,m}? 重復n到m次,但盡可能少重復{n,}? 重復n次以上,但盡可能少重復
    \W 匹配任意不是字母,數字,下划線,漢字的字符
    \S 匹配任意不是空白符的字符
    \D 匹配任意非數字的字符
    \B 匹配不是單詞開頭或結束的位置
    [^x] 匹配除了x以外的任意字符
    [^abc] 匹配除了abc這幾個字母以外的任意字符
    (exp) 匹配exp,並捕獲文本到$0...$9
    (? exp) 匹配exp,並捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)(?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號
    (?=exp) 零寬斷言,匹配exp前面的位置
    (?<=exp) 匹配exp后面的位置
    (?!exp) 匹配后面跟的不是exp的位置
    (?<!exp) 匹配前面不是exp的位置
    (?#comment) 注釋,這種類型的分組不對正則表達式的處理產生任何影響,用於提供注釋讓人閱讀


免責聲明!

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



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