nginx代理跨域,根據路徑引數改變目標伺服器地址
阿新 • • 發佈:2018-12-15
我們都知道nginx是可以做跨域代理的:
location ^~ /visited-path/ {
proxy_pass http://another-domain/;
}
舉個例子:假如我們的代理伺服器域名為proxy.com
location ^~ /external/log {
proxy_pass http://proxy.com/log;
}
以上代理設定,將對當前server訪問的location中,包含有external/log的訪問,全部都代理到了http://proxy.com/log這個跨域地址上。
現在有一個需求是:根據要訪問的地址的不同,而改變代理伺服器的地址。比如說我有三臺或更多代理伺服器,地址分別為proxy1.com、proxy2.com、proxy3.com…,那麼我要根據訪問路徑external/log1、external/log2、external/log3…來確定訪問哪臺代理伺服器。比如:當路徑為external/log1時訪問proxy1.com,當路徑為external/log2時訪問proxy2.com…
這裡推薦一種方式,使用正則來進行判斷,nginx支援在proxy_pass中使用正則的分組匹配結果:
location ~* /visited-path/(.+?)/(.*) {
resolver your-dns-srever-ip;
proxy_pass http://the_left_domain_string$1the_rest_domain_string/$2?$args;
}
按照我們之前舉的例子就是:
location ~* /external/log(.+?)/(.*) {
#resolver根據實際修改,可通過檢視計算機網路配置檢視dns配置資訊
resolver 192.168 .0.1;
proxy_pass http://proxy$1.com/$2?$args;
}
注意不可以缺少最後的$args,不然會報proxy_pass配置出錯。
注意不可以缺少resolver地址,或地址配置不正確,否則會報無法resolve地址的錯誤。
這樣配置以後,當我們訪問 http://original-domain/external/log2/sub-path?a=1這個路徑的時候,nginx就會自動代理為:http://proxy2.com/sub-path?a=1