1.本文內容
使用反向代理解決請求跨域問題,以及如何利用請求參數配置一個動態反向代理
2.問題場景
公司有一個“文檔接口服務”,用來維護公司所有項目的接口文檔。
現假定:
接口文檔地址:http://192.168.1.100:8080/doc
項目接口地址:http://192.168.1.200:8090/api
接口文檔和項目不在同一個服務器且端口都不相同,出現了跨域的問題,接口無法正常模擬。
ps:什么是跨域?當一個請求url的協議、域名(IP)、端口三者之間任意一個與當前頁面url不同即為跨域。
在不改動接口服務代碼的情況下,使用nginx反向代理來解決跨域,方式如下
2.1.nginx反向代理
- 在192.168.1.100(接口文檔服務器)安裝nginx,監聽8081端口
- 將
/doc
請求代理到http://192.168.1.100:8080/doc
- 將
/api
請求代理到http://192.168.1.200:8090/api
具體配置如下:
server {
listen 8081;
server_name localhost;
# 代理應用服務接口
location /api {
proxy_pass http:192.168.1.200:8090/api;
}
# 代理文檔服務
location /doc {
proxy_pass http://192.168.1.100:8080/doc;
}
}
- 此后我們就需要通過代理地址訪問“接口文檔服務”了:
http://192.168.1.100:8081/doc
;
我們接口文檔中原本的接口地址也需要做相應的修改
例:http://192.168.1.200:8090/api/login
現在要改為http://192.168.1.100:8081/api/login
此時我們的所有操作都在http://192.168.1.100:8081/
服務完成,跨域問題解決。
2.2.nginx動態反向代理(根據請求的參數進行動態配置代理)
“接口文檔服務”肯定不止維護一個項目的接口文檔,如果還按照2.1
中進行配置,那么項目多了維護成本就很高,此時就考慮使用動態的方式去做。
配置如下:
server {
listen 8081;
server_name localhost;
location /doc {
if ( $arg_url != "" ) {
proxy_pass $arg_url;
}
proxy_pass http://192.168.1.100:8080/doc;
}
}
-
nginx關鍵字:
$arg_
$arg_
可以獲取到請求路徑中的參數值,
比如:http://192.168.1.100:8081/doc?url=abc
$arg_url
就能獲取到abc
-
nginx關鍵字:
if
if
判斷是否有url參數,如果有則直接轉發到url地址,如果沒有則正常轉發到“接口文檔服務” -
接口地址拼接(重點)
動態反向代理后,接口地址就需要兩部分,
第一部分是固定的,就是“接口文檔服務”的代理地址http://192.168.1.100:8081/doc?url=
第二部分是真實的業務接口地址,比如:http://192.168.1.200:8090/api/login
接口文檔的完整地址就是:http://192.168.1.100:8081/doc?url=http://192.168.1.200:8090/api/login
注意事項:
1.location /doc {
這個/doc
不能寫成/doc/
會有奇怪的問題,有興趣的可以研究下。
2.if
需要補充對應的空格,否則會報錯