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