日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx匹配规则详解

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx匹配规则详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、介紹

location指令是http模塊當中最核心的一項配置,根據預先定義的URL匹配規則來接收用戶發送的請求,根據匹配結果,將請求轉發到后臺服務器、非法的請求直接拒絕并返回403、404、500錯誤處理等。本文結合語法、優先級、匹配規則做描述。

二、location指令語法

location [=|~|~*|^~|@] /uri/ { … } 或 location @name { … }

location 順序/優先級:

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)

解釋說明(下面會有詳解):

=?開頭表示精確匹配; 如: A 中只匹配根目錄結尾的請求,后面不能帶任何字符串.

^~?開頭表示uri以某個常規字符串開頭,不是正則匹配;

~?開頭表示區分大小寫的正則匹配;

~*?開頭表示不區分大小寫的正則匹配;

/?通用匹配, 如果沒有其它匹配,任何請求都會匹配到;

三、URI匹配模式

location指令分為兩種匹配模式:

1> 普通字符串匹配:以=開頭或開頭無引導字符(~)的規則

2> 正則匹配:以~或~*開頭表示正則匹配,~*表示正則不區分大小寫

四、location URI匹配規則

當nginx收到一個請求后,會截取請求的URI部份,去搜索所有location指令中定義的URI匹配模式。在server模塊中可以定義多個location指令來匹配不同的url請求,多個不同location配置的URI匹配模式,總體的匹配原則是:先匹配普通字符串模式,再匹配正則模式。只識別URI部份,例如請求為:/test/abc/user.do?name=xxxx

一個請求過來后,Nginx匹配這個請求的流程如下:

1> 先查找是否有=開頭的精確匹配,如:location = /test/abc/user.do { … }

2> 再查找普通匹配,以 最大前綴 為原則,如有以下兩個location,則會匹配后一項

* location /test/ { … }

* location /test/abc { … }

3> 匹配到一個普通格式后,搜索并未結束,而是暫存當前匹配的結果,并繼續搜索正則匹配模式

4> 所有正則匹配模式location中找到第一個匹配項后,就以此項為最終匹配結果

所以正則匹配項匹配規則,受定義的前后順序影響,但普通匹配模式不會

5> 如果未找到正則匹配項,則以3中緩存的結果為最終匹配結果

6> 如果一個匹配都沒搜索到,則返回404

五、精確匹配與模糊匹配差別

location =/ { … } 與 location / { … } 的差別:

* 前一個是精確匹配,只響應/請求,所有/xxx或/xxx/xxxx類的請求都不會以前綴的形式匹配到它

* 后一個是只要以 / 為前綴的請求都會被匹配到。如:/abc , /test/abc, /test/abc/aaaa

實際例子后綴區分:

假設nginx中的配置是:

server {listen 80;server_name x.x.x.x;......location /subdir {proxy_pass http://y.y.y.y; ###注意這里沒有以/結尾}}

那么用戶請求http://x.x.x.x/subdir/other時,匹配到該區塊,nginx反代保留虛擬路徑,nginx實際
轉發后端的請求URL為http://http://x.x.x.x/subdir/other

假如配置為:

server {listen 80;server_name x.x.x.x;......location /subdir {proxy_pass http://y.y.y.y/; ##注意這里以/結尾}}

那么用戶請求http://x.x.x.x/subdir/other時,匹配到該區塊,nginx反代不會保留虛擬路徑,nginx實際
轉發后端的請求URL為http://http://x.x.x.x//other

六、正則與非正則匹配

1> location ~ /test/.+.jsp$ { … } :正則匹配,支持標準的正則表達式語法。

2> location ^~ / { … } : ^~意思是關閉正則匹配,當搜索到這個普通匹配模式后,將不再繼續搜索正則匹配模式。

常用正則

  • .?: 匹配除換行符以外的任意字符
  • ??: 重復0次或1次
  • +?: 重復1次或更多次
  • *?: 重復0次或更多次
  • \d?:匹配數字
  • ^?: 匹配字符串的開始
  • $?: 匹配字符串的介紹
  • {n}?: 重復n次
  • {n,}?: 重復n次或更多次
  • [c]?: 匹配單個字符c
  • [^/]?: 匹配除了/之外的所有字符
  • [a-z]?: 匹配a-z小寫字母的任意一個

下面看一些實際例子:

location = / {# 精確匹配 / ,主機名后面不能帶任何字符串[ configuration A ] } location / {# 因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求# 但是正則和最長字符串會優先匹配[ configuration B ] } location /documents/ {# 匹配任何以 /documents/ 開頭的地址,匹配符合以后,還要繼續往下搜索# 只有后面的正則表達式沒有匹配到時,這一條才會采用這一條[ configuration C ] } location ~ /documents/Abc {# 匹配任何以 /documents/Abc 開頭的地址,匹配符合以后,還要繼續往下搜索# 只有后面的正則表達式沒有匹配到時,這一條才會采用這一條[ configuration CC ] } location ^~ /images/ {# 匹配任何以 /images/ 開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條。[ configuration D ] } location ~* \.(gif|jpg|jpeg)$ {# 匹配所有以 gif,jpg或jpeg 結尾的請求# 然而,所有請求 /images/ 下的圖片會被 config D 處理,因為 ^~ 到達不了這一條正則[ configuration E ] } location /images/ {# 字符匹配到 /images/,繼續往下,會發現 ^~ 存在[ configuration F ] } location /images/abc {# 最長字符匹配到 /images/abc,繼續往下,會發現 ^~ 存在# F與G的放置順序是沒有關系的[ configuration G ] } location ~ /images/abc/ {# 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續往下搜索,匹配到這一條正則,采用[ configuration H ] } location ~* /js/.*/\.js {# 不區分大小寫匹配[ configuration I ] }

總結

以上是生活随笔為你收集整理的nginx匹配规则详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。