Nginx 匹配規(guī)則

Nginx 內(nèi)核源碼解析

nginx location 練習(xí)

Nginx location 配置踩坑過程分享
nginx配置location總結(jié)及rewrite規(guī)則寫法
location 匹配規(guī)則

在頁面輸出 nginx 配置文件

server    {
    listen 80;
    server_name tmp.kaibuy.cn;
    index index.php;
    root  /home/web/blog/public/www;
    #error_page   404   /404.html;
    location / {
        default_type  text/plain;
        gzip off;
        set $str "This Host : ";
        return 200 "$str $http_host";
    }

    access_log off;
}
  • default_type text/plain;是指定以文本方式打印,如果不加這句,搞不好會以下載文件的方式出現(xiàn)。當(dāng)然也可以指定為HTML,具體代碼見后面的mime.types中。
  • gzip off;關(guān)閉壓縮,也可以不關(guān),這個不重要。
  • set $str "This Host : ";設(shè)定一個變量,如果變量內(nèi)容是單詞,也可以:set $str MyValue;,這種不帶引號時,中間不能有空格即可。
  • return 200 "$str $http_host";返回內(nèi)容體,前面200是狀態(tài)碼,可以是任意符合HTML狀態(tài)碼的代碼,這任意。后面引號里的是兩個變量,$str是剛才定義的變量,$http_host是nginx系統(tǒng)變量。這兒也可以寫成return 200 $str$http_host;也就是不帶引號,但變量之間要是連續(xù)的,不能有空格。
location  = / {
  # 精確匹配 / ,主機(jī)名后面不能帶任何字符串
  [ configuration A ]
}
location  / {
  # 因?yàn)樗械牡刂范家?/ 開頭,所以這條規(guī)則將匹配到所有請求
  # 但是正則和最長字符串會優(yōu)先匹配
  [ configuration B ]
}
location /documents/ {
  # 匹配任何以 /documents/ 開頭的地址,匹配符合以后,還要繼續(xù)往下搜索
  # 只有后面的正則表達(dá)式?jīng)]有匹配到時,這一條才會采用這一條
  [ configuration C ]
}
location ~ /documents/Abc {
  # 匹配任何以 /documents/Abc 開頭的地址,匹配符合以后,還要繼續(xù)往下搜索
  # 只有后面的正則表達(dá)式?jīng)]有匹配到時,這一條才會采用這一條
  [ configuration CC ]
}
location ^~ /images/ {
  # 匹配任何以 /images/ 開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條。
  [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 結(jié)尾的請求
  # 然而,所有請求 /images/ 下的圖片會被 config D 處理,因?yàn)?^~ 到達(dá)不了這一條正則
  [ configuration E ]
}
location /images/ {
  # 字符匹配到 /images/,繼續(xù)往下,會發(fā)現(xiàn) ^~ 存在
  [ configuration F ]
}
location /images/abc {
  # 最長字符匹配到 /images/abc,繼續(xù)往下,會發(fā)現(xiàn) ^~ 存在
  # F與G的放置順序是沒有關(guān)系的
  [ configuration G ]
}
location ~ /images/abc/ {
  # 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續(xù)往下搜索,匹配到這一條正則,采用
    [ configuration H ]
}
location ~* /js/.*/\.js
  • 以=開頭表示精確匹配
    如 A 中只匹配根目錄結(jié)尾的請求,后面不能帶任何字符串。
  • ^~ 開頭表示uri以某個常規(guī)字符串開頭,不是正則匹配
  • ~ 開頭表示區(qū)分大小寫的正則匹配;
  • ~* 開頭表示不區(qū)分大小寫的正則匹配
  • / 通用匹配, 如果沒有其它匹配,任何請求都會匹配到

順序 no優(yōu)先級:
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ,* 正則順序) > (location 部分起始路徑) > (/)

  • / -> config A
    精確完全匹配,即使/index.html也匹配不了
  • /downloads/download.html -> config B
    匹配B以后,往下沒有任何匹配,采用B
  • /images/1.gif -> configuration D
    匹配到F,往下匹配到D,停止往下
  • /images/abc/def -> config D
    最長匹配到G,往下匹配D,停止往下
    你可以看到 任何以/images/開頭的都會匹配到D并停止,F(xiàn)G寫在這里是沒有任何意義的,H是永遠(yuǎn)輪不到的,這里只是為了說明匹配順序
  • /documents/document.html -> config C
    匹配到C,往下沒有任何匹配,采用C
  • /documents/1.jpg -> configuration E
    匹配到C,往下正則匹配到E
  • /documents/Abc.jpg -> config CC
    最長匹配到C,往下正則順序匹配到CC,不會往下到E

實(shí)際使用建議

所以實(shí)際使用中,個人覺得至少有三個匹配規(guī)則定義,如下:
直接匹配網(wǎng)站根,通過域名訪問網(wǎng)站首頁比較頻繁,使用這個會加速處理,官網(wǎng)如是說。
這里是直接轉(zhuǎn)發(fā)給后端應(yīng)用服務(wù)器了,也可以是一個靜態(tài)首頁
第一個必選規(guī)則

location = / {
    proxy_pass http://tomcat:8080/index
}

第二個必選規(guī)則是處理靜態(tài)文件請求,這是nginx作為http服務(wù)器的強(qiáng)項(xiàng)
有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用

location ^~ /static/ {
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

第三個規(guī)則就是通用規(guī)則,用來轉(zhuǎn)發(fā)動態(tài)請求到后端應(yīng)用服務(wù)器
非靜態(tài)文件請求就默認(rèn)是動態(tài)請求,自己根據(jù)實(shí)際把握
畢竟目前的一些框架的流行,帶.php,.jsp后綴的情況很少了

location / {
    proxy_pass http://tomcat:8080/
}

常用正則

  • . : 匹配除換行符以外的任意字符
  • ? : 重復(fù)0次或1次
    • : 重復(fù)1次或更多次
    • : 重復(fù)0次或更多次
  • \d :匹配數(shù)字
  • ^ : 匹配字符串的開始
  • $ : 匹配字符串的介紹
  • {n} : 重復(fù)n次
  • {n,} : 重復(fù)n次或更多次
  • [c] : 匹配單個字符c
  • [a-z] : 匹配a-z小寫字母的任意一個
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容