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

咱們都知道nginx是能夠作跨域代理的:nginx

location ^~ /visited-path/ {
    proxy_pass   http://another-domain/;
}

舉個例子:假如咱們的代理服務器域名爲proxy.comweb

location ^~ /external/log {
    proxy_pass   http://proxy.com/log;
}

以上代理設置,將對當前server訪問的location中,包含有external/log的訪問,所有都代理到了http://proxy.com/log這個跨域地址上。跨域

如今有一個需求是:根據要訪問的地址的不一樣,而改變代理服務器的地址。好比說我有三臺或更多代理服務器,地址分別爲proxy1.com、proxy2.com、proxy3.com…,那麼我要根據訪問路徑external/log一、external/log二、external/log3…來肯定訪問哪臺代理服務器。好比:當路徑爲external/log1時訪問proxy1.com,當路徑爲external/log2時訪問proxy2.com…ruby

這裏推薦一種方式,使用正則來進行判斷,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地址的錯誤。dom

這樣配置之後,當咱們訪問 http://original-domain/external/log2/sub-path?a=1這個路徑的時候,nginx就會自動代理爲:http://proxy2.com/sub-path?a=1svg

相關文章
相關標籤/搜索