跳至主要内容

前端 HTTPS 對接後端 HTTP

5/23/2024 發布

情境:
前端是 React + Vite
後端是運行在某個 HTTP 協定的 ASP.NET 程式
此配置會在瀏覽器看到 Mixed-Content 的報錯

Vercel 部署設定

假設前端是透過 Vercel 部署,可以在專案根目錄新增 vercel.json

{
"rewrites": [
{
"source": "/api/:path*",
"destination": "http://your.backend.server/api/:path*"
}
]
}

source 是攔截指定路徑,destination 是自動改寫後的路徑,
例如:對 /api/member/signup 發出請求,
經過自動改寫後會對 http://your.backend.server/api/member/signup 請求。

注意

注意上面的動態路由是寫 /:path* 而不是 /:path
沒有星號 * 的話只會捕捉這串路徑 /api/member/signup 的第一個區間 /member
後面的 /signup 就不會被捕捉到!

網路請求的 URL 也要修改,將後端的 domain 移除,留下後面的路徑即可:

// 原本的
fetch("http://your.backend.server/api/member/signup", config);

// 修改後
fetch("/api/member/signup", config);

上面修改後的 fetch 函式執行時就會被 Vercel 攔截,自動改寫完才向後端發出,
不是用 Vercel 來部署的話,一般 PaaS 供應商也有提供類似的設定,
去參考他們提供的文件即可。(就是不要問我 Vercel 以外的東西的意思


本地端設定

一路改到這裡會有個問題:
我那些 fetch 的 url 全改了,那我在本地端開發的時候怎麼辦?

本地端開發時當然不會被 Vercel 的設定攔截到,
這個請求 fetch('/api/member/signup', config) 會直接對本地端發出,
然後就報錯了。

vite.config.js 加入 server 設定:

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";

export default defineConfig({
plugins: [react()],
// 加入以下設定
server: {
proxy: {
"/api": {
target: "http://your.backend.server",
changeOrigin: true,
// 如果有字串需要替換可以加入 rewrite 這個屬性
// rewrite: (path) => path.replace(/^\/api/, '')
},
},
},
});

本地端在開發時就會套用這個 proxy 代理設定,
攔截到 /api 開頭的請求後會把這串請求的路徑加入到 target 的網址後面,
跟剛剛 vercel.json 做的事情是一樣的!

Vercel 部署時是把我們的專案 build(打包)後再運行,
而 Vite 在打包時不會把剛剛在 vite.config.js 加入的 server 設定也編譯進去,
所以不用擔心這個代理設定會覆蓋到 vercel.json 的設定!


參考資料