Nginx 配置反向代理

1. location的配置


語法規(guī)則

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

~ 為區(qū)分大小寫匹配(可用正則表達式)

!~為區(qū)分大小寫不匹配

~* 為不區(qū)分大小寫匹配(可用正則表達式)

!~*為不區(qū)分大小寫不匹配

^~ 開頭表示uri以某個常規(guī)字符串開頭,Nginx將在這個字符串匹配后停止進行正則表達式的匹配(location指令中正則表達式的匹配的結果優(yōu)先使用),如: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,可以被規(guī)則^~ /static/ /aa匹配到(注意是空格)。

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

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



優(yōu)先級順序

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


示例

location = / {

# 只匹配 / 查詢。

}

location / {

# 匹配任何查詢,因為所有請求都已 / 開頭。但是正則表達式規(guī)則和長的塊規(guī)則將被優(yōu)先和查詢匹配。

}

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/開頭的地址,匹配符合以后,停止往下搜索正則。

2.

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代表匹配一個之后停止匹配。

3.

proxy_pass

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

不帶/

location /html/

{

  proxy_pass http://b.com:8300;?

}

帶/

location /html/?

{?

????proxy_pass http://b.com:8300/;?

}

上面兩種配置,區(qū)別只在于proxy_pass轉發(fā)的路徑后是否帶 “/”。

  針對情況1,如果訪問url = http://server/html/test.jsp,則被nginx代理后,請求路徑會便問http://proxy_pass/html/test.jsp,將test/ 作為根路徑,請求test/路徑下的資源。

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


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

3.參考文檔


nginx配置location總結及rewrite規(guī)則寫法

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容