使用nginx反向代理和動態反向代理解決請求跨域問題


1.本文內容

使用反向代理解決請求跨域問題,以及如何利用請求參數配置一個動態反向代理

2.問題場景

公司有一個“文檔接口服務”,用來維護公司所有項目的接口文檔。
現假定:
接口文檔地址:http://192.168.1.100:8080/doc
項目接口地址:http://192.168.1.200:8090/api
接口文檔和項目不在同一個服務器且端口都不相同,出現了跨域的問題,接口無法正常模擬。
ps:什么是跨域?當一個請求url的協議、域名(IP)、端口三者之間任意一個與當前頁面url不同即為跨域。

在不改動接口服務代碼的情況下,使用nginx反向代理來解決跨域,方式如下

2.1.nginx反向代理

  1. 在192.168.1.100(接口文檔服務器)安裝nginx,監聽8081端口
  2. /doc請求代理到http://192.168.1.100:8080/doc
  3. /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;
	}

}
  1. 此后我們就需要通過代理地址訪問“接口文檔服務”了: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;
	}

}
  1. nginx關鍵字:$arg_
    $arg_可以獲取到請求路徑中的參數值,
    比如:http://192.168.1.100:8081/doc?url=abc
    $arg_url就能獲取到abc

  2. nginx關鍵字:if
    if判斷是否有url參數,如果有則直接轉發到url地址,如果沒有則正常轉發到“接口文檔服務”

  3. 接口地址拼接(重點)
    動態反向代理后,接口地址就需要兩部分,

第一部分是固定的,就是“接口文檔服務”的代理地址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需要補充對應的空格,否則會報錯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM