nginx proxy_pass 與 rewrite 簡記

rewrite
syntax: rewrite regex replacement [flag]
Default: —
Context: server, location, if
  • 若是正則表達式(regex)匹配到了請求的URI(request URI),這個URI會被後面的replacement替換
  • rewrite的定向會根據他們在配置文件中出現的順序依次執行
  • 經過使用flag能夠終止定向後進一步的處理
  • 若是replacement以「http://」, 「https://」, or 「$scheme」開頭,處理將會終止,請求結果會以重定向的形式返回給客戶端(client)
  • 若是replacement字符串裏有新的request參數,那麼以前的參數會附加到其後面,若是要避免這種狀況,那就在replacement字符串後面加上「?」,eg:
     rewrite ^/users/(.*)$ /show?user=$1? last;=
  • 若是正則表達式(regex)裏包含「}」 or 「;」字符,須要用單引號或者雙引號把正則表達式引發來
可選的 flag參數以下:
  • last
  1. 結束當前的請求處理,用替換後的URI從新匹配location;
  2. 可理解爲重寫(rewrite)後,發起了一個新請求,進入server模塊,匹配location;
  3. 若是從新匹配循環的次數超過10次,nginx會返回500錯誤;
  4. 返回302 http狀態碼 ;
  5. 瀏覽器地址欄顯示重地向後的url
  • break
  1. 結束當前的請求處理,使用當前資源,不在執行location裏餘下的語句;
  2. 返回302 http狀態碼 ;
  3. 瀏覽器地址欄顯示重地向後的url
  •  redirect
  1. 臨時跳轉,返回302 http狀態碼;
  2. 瀏覽器地址欄顯示重地向後的url
  • permanent
  1. 永久跳轉,返回301 http狀態碼;
  2. 瀏覽器地址欄顯示重定向後的url

 

Nginx配置proxy_pass轉發的/路徑問題html

在nginx中配置proxy_pass時,若是是按照^~匹配路徑時,要注意proxy_pass後的url最後的/,當加上了/,至關因而絕對根路徑,則nginx不會把location中匹配的路徑部分代理走;若是沒有/,則會把匹配的路徑部分也給代理走。nginx

location ^~ /static_js/ 

proxy_cache js_cache; 
proxy_set_header Host js.test.com; 
proxy_pass http://js.test.com/
}正則表達式

如上面的配置,若是請求的url是http://servername/static_js/test.html
會被代理成http://js.test.com/test.html後端

而若是這麼配置瀏覽器

location ^~ /static_js/ 

proxy_cache js_cache; 
proxy_set_header Host js.test.com; 
proxy_pass http://js.test.com
}url

則會被代理到http://js.test.com/static_js/test.htmspa

固然,咱們能夠用以下的rewrite來實現/的功能代理

location ^~ /static_js/ 

proxy_cache js_cache; 
proxy_set_header Host js.test.com; 
rewrite /static_js/(.+)$ /$1 break; 
proxy_pass http://js.test.com
unix

proxy_pass
Syntax:    proxy_pass URL;
Default:    —
Context:    location, if in location, limit_except
  • 不影響瀏覽器地址欄的url
  • 設置被代理server的協議和地址,URI可選(能夠有,也能夠沒有)
  • 協議能夠爲http或https
  • 地址能夠爲域名或者IP,端口可選;eg:
     proxy_pass http://localhost:8000/uri/;
  •  若是一個域名能夠解析到多個地址,那麼這些地址會被輪流使用,此外,還能夠把一個地址指定爲 server group(如:nginx的upstream), eg:
    複製代碼
    upstream backend {
        server backend1.example.com       weight=5;
        server backend2.example.com:8080;
        server unix:/tmp/backend3;
     
        server backup1.example.com:8080   backup;
        server backup2.example.com:8080   backup;
    }
     
    server {
        location / {
            proxy_pass http://backend;
        }
    }
    複製代碼
  • server name, port, URI支持變量的形式,eg:
    proxy_pass http://$host$uri;
這種狀況下,nginx會在server groups(upstream後端server)裏搜索server name,若是沒有找到,會用dns解析
請求的URI按照下面的規則傳給後端server
  1. 若是proxy_pass的URL定向裏包括URI,那麼請求中匹配到location中URI的部分會被proxy_pass後面URL中的URI替換,eg:
    location /name/ {
        proxy_pass http://127.0.0.1/remote/;
    }
    請求http://127.0.0.1/name/test.html 會被代理到http://example.com/remote/test.html
  2. 若是proxy_pass的URL定向裏不包括URI,那麼請求中的URI會保持原樣傳送給後端server,eg:
    location /name/ {
        proxy_pass http://127.0.0.1;
    }
    
    請求http://127.0.0.1/name/test.html 會被代理到http://127.0.0.1/name/test.html
  3.  一些狀況下,不能肯定替換的URI

    1. location裏是正則表達式,這種狀況下,proxy_pass裏最好不要有URI
    2. 在proxy_pass前面用了rewrite,以下,這種狀況下,proxy_pass是無效的,eg:
      location /name/ {
          rewrite    /name/([^/]+) /users?name=$1 break;
          proxy_pass http://127.0.0.1;
      }
相關文章
相關標籤/搜索