文章目錄
- 問題
- 解決方案
- 一、問題原因分析
- 二、解決方案詳解
- 1. 保持當前配置(推薦臨時方案)
- 2. 更安全的方案(推薦)
- 3. 環境區分配置(最佳實踐)
- 三、為什么開發環境不用配置?
問題
問題:本地開發時候,連接開發環境http的地址接口訪問正常;但是本地連接測試環境地址https接口訪問500
解決方案
https時候,需要配置secure: false
禁用 SSL 證書驗證
一、問題原因分析
-
開發環境 vs 測試環境的協議差異:
- 開發環境:
http://192.168.90.91:33000
(HTTP協議) - 測試環境:
https://192.168.90.60:33020
(HTTPS協議)
- 開發環境:
-
secure: false
的作用:- 當代理目標(target)使用 HTTPS 協議時,Vite 代理默認會驗證 SSL 證書的有效性。
secure: false
禁用 SSL 證書驗證,允許代理到使用自簽名證書或無效證書的 HTTPS 服務。
-
為什么開發環境不需要配置:
- 開發環境使用 HTTP 協議,不涉及 SSL 證書驗證,因此無需
secure: false
。
- 開發環境使用 HTTP 協議,不涉及 SSL 證書驗證,因此無需
-
為什么測試環境需要配置:
- 測試環境使用 HTTPS,但其證書可能是:
- 自簽名證書(非權威機構頒發)
- 證書域名與 IP 地址不匹配(如用域名證書但通過 IP 訪問)
- 證書已過期
- 瀏覽器和 Node.js 默認會拒絕此類證書,導致 500 錯誤。
- 測試環境使用 HTTPS,但其證書可能是:
二、解決方案詳解
1. 保持當前配置(推薦臨時方案)
在代理配置中顯式設置 secure: false
:
proxy: {"/inms-application": {target: loadEnv(mode, "./env/").VITE_APP_SERVEICE,changeOrigin: true,secure: false, // 禁用證書驗證// ...其他配置}
}
優點:快速解決問題
缺點:存在中間人攻擊風險(僅限開發環境可接受)
2. 更安全的方案(推薦)
步驟:
-
獲取測試環境的證書:
- 訪問
https://192.168.90.60:33020
→ 點擊地址欄鎖圖標 → 導出證書(如test-env.crt
)
- 訪問
-
在項目中配置證書:
import fs from 'fs';server: {proxy: {"/inms-application": {target: loadEnv(mode, "./env/").VITE_APP_SERVEICE,changeOrigin: true,secure: true, // 保持驗證ca: fs.readFileSync('path/to/test-env.crt'), // 添加自簽名證書}} }
優點:保持安全性
缺點:需額外證書文件
3. 環境區分配置(最佳實踐)
const isTestEnv = loadEnv(mode, "./env/").VITE_APP_SERVEICE.includes('https');server: {proxy: {"/inms-application": {target: loadEnv(mode, "./env/").VITE_APP_SERVEICE,changeOrigin: true,secure: !isTestEnv, // 僅在測試環境禁用驗證}}
}
三、為什么開發環境不用配置?
- HTTP 協議無需證書:開發環境使用 HTTP,代理時不會觸發 SSL 驗證流程。
- 測試環境觸發驗證:HTTPS 協議要求證書合法性檢查,而測試環境的證書不符合 Node.js 的默認信任規則。
💡 根本原因:測試環境的 HTTPS 證書未通過 Node.js 的嚴格驗證(自簽名/IP不匹配/過期等),而開發環境的 HTTP 不存在此問題。