1. 程式人生 > >nginx代理跨域,根據路徑引數改變目標伺服器地址

nginx代理跨域,根據路徑引數改變目標伺服器地址

我們都知道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