Nginx Location 指令語法解析

nginx location

本文翻譯自 www.keycdn.com/support/ngi…php

背景

Nginx location是使用 nginx 的過程當中必需要掌握的技能,不管是在server blocks 仍是其餘 location blocks中都會用到,這篇文章簡單介紹了當請求來臨時location指令是如何處理客戶端URI請求的.html

Nginx 的塊(Block)配置

Nginx 將配置按照層級關係,用塊狀形式進行配置,每當一個請求來臨時,nginx 服務器就會處理這個請求到底會映射到哪一個塊配置.在 Nginx 的配置文件中,兩種主要的塊配置是:nginx

  • server塊配置
  • location 塊配置 server的塊配置包含一系列的虛擬 server 配置,多個 server 配置就能夠對多個 domain name 的請求,也包括 ip 端口進行處理. 而location配置在server塊配置中起着相當重要的做用,決定了URI或者資源請求應該如何被處理,這些 URI 請求能夠被拆分爲多個location的配置

Nginx Location 指令語法

以下就是經常使用的 location 配置的語法格式,其中modifier是可選的,location_match就是制定 URI 應該去往哪一個配置的關鍵.web

location optional_modifier location_match {
 . . .
}
複製代碼

Regular expressions(RE)或者字面量均可以用來定義modifier,若是 location 配置中制定了modifier,可能會改變 nginx匹配 location的方式,以下介紹幾種最重要的modifier:正則表達式

  • (none) 徹底沒有modifier表示 location會解釋爲前綴匹配,要肯定匹配項,將根據從URI的開頭匹配該location.
  • = 等號表示當前這個 location 會匹配一個肯定的請求,配置什麼就匹配什麼請求,若是匹配上了,就會中止搜索.
  • ~ 波浪號表示當前這個 location 會當成一個大小寫敏感的RE匹配.
  • ~* 波浪號跟星號標識 location 會按照大小寫不敏感的 RE 匹配.
  • ^~ 非表達式(RE)匹配,正則表達式將不會生效.

Ngnix Location的匹配順序

對於每一個請求來講,nginx 會選擇最匹配的一個 location 來處理這個請求,nginx 其實就是經過對比這些 location 規則來選擇一個 location,對比的順序能夠總結爲:express

  1. 首先匹配前綴匹配(沒有 RE 表達式),針對當前這個請求,每一個前綴匹配都匹配一遍.
  2. 搜索=匹配,若是當前請求匹配上了,搜索將會中止,直接使用這個這個 location.
  3. 若是第二步沒有匹配上,nginx 會按照以下步驟繼續搜索最長前綴匹配: 3.1 若是最長前綴匹配有^~這個modifier,nginx 會中止搜索並直接使用這個 location. 3.2 若是沒有使用 ^~,暫存這個 location而且繼續搜索.
  4. 只要最長前綴匹配被暫存和選中,nginx 就會看當前的 location 是否有大小寫敏感的 RE(~~*),第一個匹配上這種會被當作有效的 location來處理這個請求.
  5. 若是沒有 RE 的 location 匹配上,前面暫存的 location 就會被選中來處理這個請求.

注:因此 沒有修飾符的 location 實際上是很浪費資源的,能夠用 ^~ 來替代.服務器

舉例

以下是一些 location 配置的例子,用來詳細描述上面所說的處理順序,你也能夠按照具體實際狀況來修改這些例子.dom

location  = / {
  # 只處理請求 /.
}
複製代碼
location /data/ {
  # 全部以 /data/ 匹配,可是還會繼續搜索.
  # 若是沒有其餘 location 匹配上,就用這個處理請求.
}
複製代碼
location ^~ /img/ {
  # 全部以 /img/ 開頭的請求而且會中止搜索.
}
複製代碼
location ~* .(png|gif|ico|jpg|jpeg)$ {
  # 以png, gif, ico, jpg ,jpeg結尾的請求. 
  # 若是請求是到 /img/ 路徑的話 仍是會被上面👆的 location 處理
}
複製代碼

如何防止圖片盜鏈:jsp

location ~ .(png|gif|jpe?g)$ {
  valid_referers none blocked yourwebsite.io *.yourwebsite.io;
  if ($invalid_referer) {
  return   403;
  }
}
複製代碼

在可寫權限的目錄禁止腳本:spa

location ~* /(media|images|cache|tmp|logs)/.*.(php|jsp|pl|py|asp|cgi|sh)$ {
  return 403;
}
複製代碼

更多 nginx location 指令的信息,能夠參見官網:Nginx

相關文章
相關標籤/搜索