nginx配置:location配置原理及實例詳解

ODYRoseann 8年前發布 | 23K 次閱讀 Nginx Web服務器

來自: http://www.cnblogs.com/sunkeydev/p/5225051.html

今天深入研究了下nginx的location的用法,已經一些需要注意的細節,現在做一個歸納總結,以備后面查詢。

location匹配的是nginx的哪個變量?

$request_uri

location的匹配種類有哪些?

一般格式  location [ 空格 | = | ~ | ~ | !~ | !~ ] /uri/ {}

  • 精確匹配: 相等(=)
  • 字符串匹配: 字符串匹配(空格) 匹配開頭(^~)
  • 正則匹配: 區分大小寫匹配(~) 不區分大小寫匹配(~) 區分大小寫不匹配(!~) 不區分大小寫不匹配(!~)</pre>

    location搜索優先級優先級如何?

    精確匹配 > 一般匹配( 長 > 短 [ 注: ^~ 匹配則停止匹配 ]) > 正則匹配( 上 > 下 )

  • 精確匹配只能命中一個

  • 字符串匹配使用匹配最長的最為匹配結果
  • 正則匹配按照location定義的順序進行匹配,先定義具有高優先級</pre>

    特別注意: 字符串匹配優先搜索,但是只是記錄下最長的匹配 ( 如果 ^~ 是最長的匹配,則會直接命中,停止搜索正則 ),然后繼續搜索正則匹配,如果有正則匹配,則命中正則匹配,如果沒有正則匹配,則命中最長的字符串匹配.

    舉例說明

    ( 這里使用了 echo-nginx-module 模塊,方便做輸出測試 )

    精確匹配

location = /images/test.png { echo 'config1'; }

location /images/test.png { echo 'config2'; }

location \/images\/test.png$ { echo 'config3'; } 如果此時請求 http://127.0.0.1/images/test.png 會輸出什么呢? 輸出 config1, 毋容置疑,精確匹配優先級最高!</pre>

精確匹配的特殊情況

location = / { index index.html; }

location / { echo 'config2'; }

此時是輸入http://127.0.0.1 會輸出什么呢? 是輸出 config2, 怎么精確匹配的優先級不靈了呢? 是這樣的,精確匹配還是起作用了,請求目錄(非具體文件),nginx會將請求內部定向到index文件, 既此時真正的請求是http://127.0.0.1/index.html, 這是 config2則被命中! 所以精確匹配不要用來匹配 /</pre>

字符串搜索與正則搜索

location /images/test.png { echo 'config1'; }

location ^~ /images/ { echo 'config2'; }

location ~ \/images\/test.png$ { echo 'config3'; }

location ~ \/images\/ { echo 'config4'; }

如果此時請求 http://127.0.0.1/images/test.png 會輸出什么呢? 當然是 config3,正則命中 (雖然 config1 為最長匹配的字符串,此時只做記錄,后面還要搜索正則匹配,則config3正則匹配命中), 仔細觀察可以發現config4也被匹配成功了,但是正則的匹配順序是按照location的定義順序匹配的,所以config3命中.</pre>

字符串匹配優先級的提升( ^~ )

location /images/ { echo 'config1'; }

location ^~ /images/test.png { echo 'config2'; }

location ~ /images/test.png$ { echo 'config3'; }

location ~ \/images\/ { echo 'config4'; }

如果此時請求 http://127.0.0.1/images/test.png 會輸出什么呢? 當然是config2, 首部匹配命中 (因為字符串匹配是優先搜索的,此時發現config2 為最長的字符串匹配且為^~匹配方式,所以停止搜索正則,直接命中!)</pre>

# 所以這里的 ^~ 符號比較特殊,就是為了字符串匹配的優先級,優先于正則匹配.
</div>

 本文由用戶 ODYRoseann 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!