nginx中的location指令
1、location 介紹
location是Nginx中的塊級指令(block directive),location指令的功能是用來匹配不同的url請求,進而對請求做不同的處理和響應,這其中較難理解的是多個location的匹配順序,本文會作為重點來解釋和說明。
開始之前先明確一些約定,我們輸入的網址叫做請求URI,nginx用請求URI與location中配置的URI做匹配。
2、localtion 語法
location有兩種匹配規則:
-  匹配URL類型,有四種參數可選,當然也可以不帶參數。 location [ = | ~ | ~* | ^~ ] uri { … } 
-  命名location,用@標識,類似于定于goto語句塊。 location @name { … } 
location匹配參數解釋:
(1)?“=”?,精確匹配
-  內容要同表達式完全一致才匹配成功 
(2)?“~”,執行正則匹配,區分大小寫。
location ~ /Abc/ {..... } #http://abc.com/Abc/ [匹配成功] #http://abc.com/abc/ [匹配失敗](3)“~*”,執行正則匹配,忽略大小寫
location ~* /Abc/ {..... } # 則會忽略 uri 部分的大小寫 #http://abc.com/Abc/ [匹配成功] #http://abc.com/abc/ [匹配成功](4)“^~”,表示普通字符串匹配上以后不再進行正則匹配。
location ^~ /index/ {..... } #以 /index/ 開頭的請求,都會匹配上 #http://abc.com/index/index.page [匹配成功] #http://abc.com/error/error.page [匹配失敗](5)不加任何規則
-  不加任何規則時,默認是大小寫敏感,前綴匹配,相當于加了“~”與“^~” 
(6)“@”,nginx內部跳轉
location /index/ {error_page 404 @index_error; } location @index_error {..... } #以 /index/ 開頭的請求,如果鏈接的狀態為 404。則會匹配到 @index_error 這條規則上。3、location匹配順序
=?>?^~?>?~ | ~*?>?最長前綴匹配?>?/
序號越小優先級越高
location = ? ?# 精準匹配
location ^~ ? # 帶參前綴匹配
location ~ ? ?# 正則匹配(區分大小寫)
location ~* ? # 正則匹配(不區分大小寫)
location /a ? # 普通前綴匹配,優先級低于帶參數前綴匹配。
location / ? ?# 任何沒有匹配成功的,都會匹配這里處理
舉例
location = / { #規則A }location = /login { #規則B }location ^~ /static/ { #規則C }location ~ \.(gif|jpg|png|js|css)$ { #規則D }location ~* \.png$ { #規則E }location !~ \.xhtml$ { #規則F }location !~* \.xhtml$ { #規則G }location / { #規則H }匹配結果:
訪問根目錄/, 比如http://localhost/ 將匹配規則A訪問 http://localhost/login 將匹配規則B,http://localhost/register 則匹配規則H訪問 http://localhost/static/a.html 將匹配規則C訪問 http://localhost/b.jpg 將匹配規則D和規則E,但是規則D順序優先,規則E不起作用, 而 http://localhost/static/c.png 則優先匹配到 規則C訪問 http://localhost/a.PNG 則匹配規則E, 而不會匹配規則D,因為規則E不區分大小寫。訪問 http://localhost/a.xhtml 不會匹配規則F和規則G,http://localhost/a.XHTML不會匹配規則G,因為不區分大小寫。規則F,規則G屬于排除法,符合匹配規則但是不會匹配到。訪問 http://localhost/qll/id/1111 則最終匹配到規則H,因為以上規則都不匹配。4、location URI結尾帶不帶 /
如果 URI 結構是 https://domain.com/ 的形式,尾部有沒有 / 都不會造成重定向。因為瀏覽器在發起請求的時候,默認加上了 / 。雖然很多瀏覽器在地址欄里也不會顯示 / 。這一點,可以訪問百度驗證一下。
如果 URI 的結構是 https://domain.com/some-dir/ 。尾部如果缺少 / 將導致重定向。因為約定,URL 尾部的 / 表示目錄,沒有 / 表示文件。所以訪問 /some-dir/ 時,服務器會自動去該目錄下找對應的默認文件。如果訪問 /some-dir 的話,服務器會先去找 some-dir 文件,找不到的話會將 some-dir 當成目錄,重定向到 /some-dir/ ,去該目錄下找默認文件。
舉個例子:
server {listen 9001;server_name www.abc.com;location ~ /edu {proxy_pass http://127.0.0.1:8080;}}我們訪問www.abc.com:9001/edu,看下效果
訪問 /edu 時,服務器首先去找edu文件,找不到則將edu當做目錄,重定向到 /edu/,在該目錄下找默認文件。
但是如果想這兩種請求對應不同的處理,就要明確增加不帶/結尾的location配置。例如:
location /doc {proxy_pass http://www.doc123.com } location /doc/ {proxy_pass http://www.doc456.com }總結
以上是生活随笔為你收集整理的nginx中的location指令的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 改变centos系统的时区
- 下一篇: oracle的sga
