詳解Nginx location 匹配規則

發布時間:2019-03-05 10:06 來源:互聯網 當前欄目:電腦編程入門

    本篇文章主要介紹了Nginxlocation匹配規則,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
 
    語法規則
 
    location[=|~|~*|^~]/uri/{…}
 
    模式含義location=/uri=表示精確匹配,只有完全匹配上才能生效location^~/uri^~開頭對URL路徑進行前綴匹配,并且在正則之前。location~pattern開頭表示區分大小寫的正則匹配location~*pattern開頭表示不區分大小寫的正則匹配location/uri不帶任何修飾符,也表示前綴匹配,但是在正則匹配之后location/通用匹配,任何未匹配到其它location的請求都會匹配到,相當于switch中的default
 
    前綴匹配時,Nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~/static//aa匹配到(注意是空格)
 
    多個location配置的情況下匹配順序為(參考資料而來,還未實際驗證,試試就知道了,不必拘泥,僅供參考):
 
    首先精確匹配=其次前綴匹配^~其次是按文件中順序的正則匹配然后匹配不帶任何修飾的前綴匹配。最后是交給/通用匹配當有匹配成功時候,停止匹配,按當前匹配規則處理請求
 
    注意:前綴匹配,如果有包含關系時,按最大匹配原則進行匹配。比如在前綴匹配:location/dir01與location/dir01/dir02,如有請求http://localhost/dir01/dir02/file將最終匹配到location/dir01/dir02
 
    例子,有如下匹配規則:
 
    location=/{echo"規則A";}location=/login{echo"規則B";}location^~/static/{echo"規則C";}location^~/static/files{echo"規則X";}location~\.(gif|jpg|png|js|css)${echo"規則D";}location~*\.png${echo"規則E";}location/img{echo"規則Y";}location/{echo"規則F";}
 
    那么產生的效果如下:
 
    訪問根目錄/,比如http://localhost/將匹配規則A訪問http://localhost/login將匹配規則B,http://localhost/register則匹配規則F訪問http://localhost/static/a.html將匹配規則C訪問http://localhost/static/files/a.exe將匹配規則X,雖然規則C也能匹配到,但因為最大匹配原則,最終選中了規則X。你可以測試下,去掉規則X,則當前URL會匹配上規則C。訪問http://localhost/a.gif,http://localhost/b.jpg將匹配規則D和規則E,但是規則D順序優先,規則E不起作用,而http://localhost/static/c.png則優先匹配到規則C訪問http://localhost/a.PNG則匹配規則E,而不會匹配規則D,因為規則E不區分大小寫。訪問http://localhost/img/a.gif會匹配上規則D,雖然規則Y也可以匹配上,但是因為正則匹配優先,而忽略了規則Y。訪問http://localhost/img/a.tiff會匹配上規則Y。
 
    訪問http://localhost/category/id/1111則最終匹配到規則F,因為以上規則都不匹配,這個時候應該是Nginx轉發請求給后端應用服務器,比如FastCGI(php),tomcat(jsp),Nginx作為反向代理服務器存在。
 
    所以實際使用中,筆者覺得至少有三個匹配規則定義,如下:
 
    #直接匹配網站根,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。#這里是直接轉發給后端應用服務器了,也可以是一個靜態首頁#第一個必選規則location=/{proxy_passhttp://tomcat:8080/index}#第二個必選規則是處理靜態文件請求,這是nginx作為http服務器的強項#有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用location^~/static/{root/webroot/static/;}location~*\.(gif|jpg|jpeg|png|css|js|ico)${root/webroot/res/;}#第三個規則就是通用規則,用來轉發動態請求到后端應用服務器#非靜態文件請求就默認是動態請求,自己根據實際把握#畢竟目前的一些框架的流行,帶.php、.jsp后綴的情況很少了location/{proxy_passhttp://tomcat:8080/}
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、