Nginx 6個例子理解proxy_pass和rewrite的用法

Nginx 6個例子理解proxy_pass和rewrite的用法
一、rewrite描述
rewrite 可以重寫path,也可以重寫整個url(如果存在協議,默認返回302臨時跳轉,即使加了 last 和 break 也無效)。

rewrite 共有4種flag:last、break、redirect(302)、permanent(301)。

當location 中存在flag時,不會再執行之後的 rewrite 指令集(包括 rewrite 和 return)。

break 和 last 作用相反,break 中止對其它 location 的規則匹配,last 繼續向其它 location 進行規則匹配。

當location中存在 rewrite 時,若要使proxy_pass生效, 須和 break 一起使用,否則proxy_pass將被跳過。

與 rewrite 同時存在時,proxy_pass 中的 path 不會替換。

二、proxy_pass描述
proxy_pass 重寫的 url 中包含 path 時,會替換 location 塊的匹配規則。
proxy_pass 中不含path時,不會發生替換。
三、舉例說明
例1 break標記

server {
  listen 9000;
  server_name localhost;

  location /info {
    rewrite ^/.* https://baidu.com permanent;
  }

  location /break {
    rewrite /.* /info break;
    proxy_pass http://127.0.0.1:9000;
    # 此 return 不會執行
    return 200 "ok";
  }
}

輸入:http://localhost:9000/break

執行過程:首先會匹配到 /break 的 location 塊,執行了 rewrite 和 proxy_pass之後,跳過 return(因爲有 break),重定向到 http://127.0.0.1:9000/info;然後再次進入 server 塊,匹配到 /info 的 location 塊,最終重定向到了baidu。

總結:兩次進入 server

例2 break命令

server {
  listen 9000;
  server_name localhost;

  location /info {
    rewrite ^/.* https://www.baidu.com permanent;
  }

  location /break {
    rewrite /.* /info;
    break;
    proxy_pass http://127.0.0.1:9000;
    # 該 return 不執行
    return 200 "ok";
  }
}

輸入:http://localhost:9000/break

執行過程:首先會匹配到 /break 的 location 塊,執行了 rewrite 和 proxy_pass,跳過 return(因爲有 break),重定向到 http://127.0.0.1:9000/info;然後,再次進行 server 塊,匹配到 /info 的 location 塊,最後重定向到了baidu。

注意:proxy_pass 最後不要寫成http://127.0.0.1:9000/,應去掉最後的斜槓,而例子(1)的寫法可加斜槓,也可不加斜槓。

總結:兩次進入 server

例3 last標記

server {
  listen 9000;
  server_name localhost;

  location /info {
    rewrite ^/.* https://www.baidu.com permanent;
  }

  location /break {
    rewrite /.* /info last;
    # 該 proxy_pass 不執行
    proxy_pass http://127.0.0.1:9000;
    # 該 return 不執行
    return 200 "ok";
  }

}

輸入:http://localhost:9000/break

執行過程:首先會匹配到 /break 的 location 塊,執行了 rewrite,跳過 return 和 proxy_pass(因爲有 last,proxy_pass 需要和 break 一起用);然後繼續匹配,匹配到 /info 的 location 塊,最後重定向到了baidu。

總結:一次進入 server,兩次 location 匹配

例4 包含proxy_pass包含path

location /api/ {
  proxy_pass http://127.0.0.1/proxy/;
}

訪問http://example.com/api/data 會被代理到 http://127.0.0.1/proxy/data

location /api/ {
  proxy_pass http://127.0.0.1/proxy;
}

因爲包含proxy_pass包含path, 所以發生了替換
http://example.com/api/data 會被代理到 http://127.0.0.1/proxydata

location /api/ {
  proxy_pass http://127.0.0.1/;
}

因爲包含proxy_pass包含path, 所以發生了替換
http://example.com/api/data 會被代理到 http://127.0.0.1/data

例5 proxy_pass 中不含path

location /api/ {
  proxy_pass http://127.0.0.1;
}

proxy_pass 中不含path時,則不會發生替換
http://example.com/api/data 會被代理到 http://127.0.0.1/api/data

例6 proxy_pass與 rewrite 同時存在時

location /api/ {
  rewrite /api/(.*) /info/$1 break;
  proxy_pass http://127.0.0.1/proxy/;
}

與 rewrite 同時存在時,proxy_pass 中的 path 不會替換,相當於不起作用
http://example.com/api/data 會被代理到 http://127.0.0.1/info/data

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章