location功能:
匹配的ngnix變量:$request_uri
作用:定義url匹配模式,可以根據請求uri判斷相應配置
配置文件中一般有多個location,分別定義了不同的匹配模式,不同的uri根據匹配結果獲取不同的配置。
location的匹配模式:
location的匹配都是前綴匹配。格式:
location [ 空格 | = | ~ | ~* | !~ | !~* ] /uri/ {}
分為3類:
- 精確模式:精確匹配(=)
- 前綴模式: 普通匹配(空格),非正則匹配(^~)
- 正則模式: 大小寫敏感匹配(~),大小寫不敏感匹配(~*),大小寫敏感不匹配(!~),大小寫不敏感不匹配(!~*)
location匹配優先級:
- 先匹配精確模式,命中精確模式,直接返回。否則,繼續匹配前綴模式。
- 前綴模式中使用最大前綴原則,選出匹配普通匹配(空格)或非正則匹配(^~)的最長location。
- 若最長前綴location是非正則匹配(^~),則返回該最長前綴location。否則,還需要繼續匹配正則模式。
- 正則模式的原則是按照正則location定義順序匹配,第一個匹配的location為正則模式結果。
- 若正則模式匹配成功,返回正則模式結果。否則,返回前綴模式中的最長前綴location。
- 在nginx版本0.7.1 - 0.8.41中,若前綴模式的最長前綴location精確匹配uri,直接返回最長前綴location。
if 精確匹配結果
return 精確匹配結果
最長前綴結果 = longest: 普通匹配(空格) or 非正則匹配(^~)
if 最長前綴結果 屬于 非正則匹配(^~)
return 最長前綴結果
if 版本 屬于 0.7.1 - 0.8.41 and 最長前綴結果 == uri:
return 最長前綴結果
首個正則結果 = first: 大小寫敏感匹配(~) or 大小寫不敏感匹配(~*) or 大小寫敏感不匹配(!~) or 大小寫不敏感不匹配(!~*)
if 首個正則結果:
return 首個正則結果
else:
return 最長前綴結果
示例
location / {}
前綴模式,匹配所有uri,最短匹配
所以,這個location為兜底location。即當其他所有location都不匹配時,命中這個location。
location = / {
[ 配置 A ]
}
location / {
[ 配置 B ]
}
location /documents/ {
[ 配置 C ]
}
location ^~ /images/ {
[ 配置 D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ 配置 E ]
}
uri:“/”
精確匹配:配置 A
uri:“/index.html”
兜底匹配:配置 B
uri:“/documents/document.html”
最長location匹配:配置 C
uri:“/images/1.gif”
非正則匹配:配置 D
uri:“/documents/1.jpg”
正則匹配:配置 E
內部location(@)
內部location不能被外部 Client 所訪問,只能用于重定向。它不能被嵌套,也不能包含嵌套的location。格式為:
location @name {}
示例:
error_page 404 = @fallback
location @fallback {
}
特殊處理location
若前綴模式location以斜杠(/)結尾,并且請求設置由proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass或 memcached_pass等處理器處理,則使用該處理器處理。
但對于末尾不帶斜杠的uri,這時會返回301并重定向到帶斜杠的uri,繼而匹配該location。
location /user/ {
proxy_pass http://user.example.com;
}
uri: /user/
轉發到ttp://user.example.com
uri:/user
返回301,并重定向到/user/
如果不希望自動重定向,可以定義兩個location,設置不同配置:
location /user/ {
proxy_pass http://user.example.com;
}
location = /user {
proxy_pass http://login.example.com;
}
```
uri:/user/
轉發到http://user.example.com;
uri:/user
轉發到http://login.example.com;