NGINX中的proxy_pass和rewrite

文章做者:luxianghaohtml

文章來源:http://www.cnblogs.com/luxianghao/p/6807081.html 轉載請註明,謝謝合做。nginx

免責聲明:文章內容僅表明我的觀點,若有不當,歡迎指正。正則表達式

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

 

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會按照下面的規則傳給後端服務,下面結合具體的例子來講明URI的傳遞規則,假設nginx中server部分的配置以下:

複製代碼
   server {
        listen       80;
        server_name example.com;
        proxy_read_timeout 120;
        proxy_send_timeout 120;
        include /etc/nginx/fastcgi_params;

        access_log  /var/log/nginx/access.log  main;
        error_log   /var/log/nginx/error.log;

        location / {
           ...
        }

}
複製代碼

 

  1. 若是proxy_pass的URL定向裏包括URI,那麼請求中匹配到location中URI的部分會被proxy_pass後面URL中的URI替換,eg:
    location /name/ {
        proxy_pass http://127.0.0.1/remote/;
    }
    請求http://example.com/name/test.html 會被代理到http://127.0.0.1/remote/test.html
  2. 若是proxy_pass的URL定向裏不包括URI,那麼請求中的URI會保持原樣傳送給後端server,eg:
    location /name/ {
        proxy_pass http://127.0.0.1;
    }
    
    請求http://example/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;
      }
相關文章
相關標籤/搜索