文法規則
location [ = | ~ | ~* | ^~ | @ ] uri { ... }
location @name { ... }
location uri { ... } // 沒有修飾符
-
:精确比對。隻有請求的url路徑與配置的字元串完全相等時,才會命中=
-
:字首比對,在正則比對前執行,且如果該項比對上,則不再進行比對^~
-
:正則比對,但是區分大小寫~
-
:正則比對,不區分大小寫~*
-
:普通比對,當上面都比對不上時,再進行該比對沒有修飾符
-
:"@" 定義一個命名的 location,使用在内部定向時,例如 error_page@
注意:在字首比對和普通比對中,按最大比對原則進行比對。比如在字首比對:
location /dir01
與
location /dir01/dir02
,如有請求
http://localhost/dir01/dir02/file
将最終比對到
location /dir01/dir02
,但請求
http://localhost/dir01/dir
會比對到
location /dir01
比對規則
- 先進行(
)精确比對,命中後不再比對=
- 再進行(
)字首比對,全部比對一次,命中最大比對的規則,命中後不再比對^~
-
|~
)正則比對,命中第一個比對成功的,命中後不再比對~*
- 進行(
)普通比對,全部比對一次,命中最大比對的規則沒有修飾符
- 以上規則都沒有命中,則報錯404
例子
可以自行修改下面的例子去驗證,這裡就不一一說明(注意:網絡上一些文章描述的規則是錯誤的,建議自行驗證)。
server {
listen 1999;
listen [::]:1999;
server_name your_host;
location /api/refresh {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultH redirect;
}
location ~* \.(jpg)$ {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultI redirect;
}
location ~ \.(gif|jpg|png|js|css)$ {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultG redirect;
}
location ~* \.(gif2|jpG|png|js|css)$ {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultJ redirect;
}
location ^~ /api {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultF redirect;
}
location = /api {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultA redirect;
}
location = /login {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultB redirect;
}
location ^~ /api/login {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultD redirect;
}
location / {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultE redirect;
}
location /demo {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultK redirect;
}
location /demo/run {
rewrite ^(.*) https://www.baidu.com/s?wd=ResultL redirect;
}
}
location @name的用法
@用來定義一個命名location。主要用于内部重定向,不能用來處理正常的請求。其用法如下:
location / {
try_files $uri $uri/ @reset
}
location @reset {
# ...do something
}