天天看點

Nginx:location比對規則

文法規則

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

比對規則

  1. 先進行(

    =

    )精确比對,命中後不再比對
  2. 再進行(

    ^~

    )字首比對,全部比對一次,命中最大比對的規則,命中後不再比對
  3. ~

    |

    ~*

    )正則比對,命中第一個比對成功的,命中後不再比對
  4. 進行(

    沒有修飾符

    )普通比對,全部比對一次,命中最大比對的規則
  5. 以上規則都沒有命中,則報錯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
}
           

繼續閱讀