Nginx 配置反向代理

sisibeloved發表於2018-03-02

1. location的配置

語法規則

location [=|~|~*|^~] /uri/ { … }

  • ~ 為區分大小寫匹配(可用正規表示式)

  • !~ 為區分大小寫不匹配

  • ~* 為不區分大小寫匹配(可用正規表示式)

  • !~* 為不區分大小寫不匹配

  • ^~ 開頭表示uri以某個常規字串開頭,Nginx將在這個字串匹配後停止進行正規表示式的匹配(location指令中正規表示式的匹配的結果優先使用),如:location ^~/images/,你希望對/images/這個目錄進行一些特別的操作,如增加expires頭,防盜鏈等,但是你又想把除了這個目錄的圖片外的所有圖片只進行增加expires頭的操作,這個操作可能會用到另外一個location,例如:location ~*\.(gif|jpg|jpeg)$,這樣,如果有請求/images/1.jpg,Nginx如何決定去進行哪個location中的操作呢?結果取決於識別符號^~,如果你這樣寫:location /images/,這樣Nginx會將1.jpg匹配到location ~*\.(gif|jpg|jpeg)$這個location中,這並不是你需要的結果,而增加了^~這個識別符號後,它在匹配了/images/這個字串後就停止搜尋其它帶正則的location。Nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。

  • = 表示精確的查詢地址,如location=/它只會匹配uri為/的請求,如果請求為/index.html,將查詢另外的location,而不會匹配這個,當然可以寫兩個location,location = /location /,這樣/index.html將匹配到後者,如果你的站點對/的請求量較大,可以使用這個方法來加快請求的響應速度。

  • @ 表示為一個location進行命名,即自定義一個location,這個location不能被外界所訪問,只能用於Nginx產生的子請求,主要為error_page和try_files。

優先順序順序

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)

示例

location = / {

# 只匹配 / 查詢。

}


location / {

# 匹配任何查詢,因為所有請求都已 / 開頭。但是正規表示式規則和長的塊規則將被優先和查詢匹配。

}

location ^~ /images/ {

# 匹配任何已 /images/ 開頭的任何查詢並且停止搜尋。任何正規表示式將不會被測試。

}

location ~*.(gif|jpg|jpeg)$ {

# 匹配任何已 gif、jpg 或 jpeg 結尾的請求。

}
複製程式碼

2. Rewrite

location ^~/proxy/html/{

    rewrite ^/proxy/html/(.*)$ /$1 break;

    proxy_pass http://www.b.com/;

}
複製程式碼

以下做一個解釋:

  1. ^~ /proxy/html/

  攔截請求,匹配任何以/proxy/html/開頭的地址,匹配符合以後,停止往下搜尋正則。

  1. rewrite ^/proxy/html/(.*)$ /$1 break;

  重寫攔截進來的請求,並且只能對域名後邊的除去傳遞的引數外的字串起作用,例如傳入www.c.com/proxy/html/api/msg?method=1&para=2,只對/proxy/html/api/msg重寫。

  rewrite後面的引數是一個簡單的正則 ^/proxy/html/(.*)$ ,$1代表正則中的第一個(),$2代表第二個()的值,以此類推。

  break代表匹配一個之後停止匹配。

  1. proxy_pass

既是把請求代理到其他主機,其中 http://www.b.com/ 寫法和 http://www.b.com 寫法的區別如下:

不帶/

  location /html/
{
  proxy_pass http://b.com:8300;
}
複製程式碼

帶/

  location /html/
{
  proxy_pass http://b.com:8300/;
}
複製程式碼

上面兩種配置,區別只在於proxy_pass轉發的路徑後是否帶 “/”。
針對情況1,如果訪問url = http://server/html/test.jsp,則被nginx代理後,請求路徑會變為http://proxy_pass/html/test.jsp,將test/ 作為根路徑,請求test/路徑下的資源。

針對情況2,如果訪問url = http://server/html/test.jsp,則被nginx代理後,請求路徑會變為http://proxy_pass/test.jsp,直接訪問server的根資源。

修改配置後重啟nginx代理就成功了。

3. 參考文件

[1] nginx配置location總結及rewrite規則寫法

[2] 用nginx的反向代理機制解決前端跨域問題

相關文章