問題背景:
需要在一個http的web服務中直接跟另一個https服務交互,不經過自身后端。
又來到了熟悉的跨域訪問問題。
解決邏輯就是使用nginx轉發,涉及到的文件也就是nginx.conf文件,前面解決minio鏈接時已經有經驗了,但沒想到這次的跨域問題還是折騰了我好幾個小時,記錄一下。
解決方式
配置nginx轉發服務, 增加https服務的轉發。
這次我沒有像解決minio鏈接里那樣改寫請求路徑,直接使用了https原本的uri。
# nginx.conf
upstream httpsService {server https-service.com:443;
}server {listen 80;server_name _;access_log /xx/xx/access.log full_proxy_log;location /api/openApi {proxy_pass https://httpsService ;proxy_set_header Host https-service.com;}....}
如果轉發還是報錯,修改nginx的日志打印格式,看看是host問題還是uri問題。
access_log /xx/xx/access.log full_proxy_log;
其中的full_proxy_log
是我新增的日志格式。完整內容如下:
# nginx配置入口文件,跟上面的不是同一個哈
http {...log_format full_proxy_log '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent" ''-> $upstream_addr$request_uri';....
}
日志輸出示例:
10.30.115.58 - - [18/Jul/2025:22:16:22 +0800] "POST /api/openApi/token HTTP/1.1" 200 460 "-" "PostmanRuntime/7.44.1" -> xx.xx.xx.xx:443/api/openApi/token
踩坑點
1.server https-service.com:443;
這里的端口
一定要帶上,否則nginx默認會轉發到80端口。即使你在proxy_pass中使用了https
。
2.proxy_set_header Host https-service.com;
要加,不然會有時候成功,有時候失敗。
總結
遇到錯誤要冷靜分析日志,日志不詳細就要想辦法加,而不是像無頭蒼蠅一樣亂試。