詳解Vite 配置中的代理功能

在前端開發過程中,你可能經常會遇到一個頭疼的問題:當你在本地啟動的前端項目中調用后端接口時,瀏覽器控制臺會報出類似 “Access to fetch at ‘http://xxx’ from origin ‘http://localhost:3000’ has been blocked by CORS policy” 的錯誤。這就是跨域問題,而 Vite 的代理功能正是解決開發階段跨域問題的有效方案。

讓我們從一段常見的 vite.config.ts 配置代碼說起,看看其中的代理設置到底是如何工作的。
在 Vite 的配置文件中,server 選項用于配置開發服務器的行為,其中的 proxy 屬性就是專門用來設置代理規則的。比如這樣的配置:

server: {host: "0.0.0.0", // 默認為localhostport: 7001, // 端口號open: false, // 是否自動打開瀏覽器proxy: {// 第三方服務器的代理配置'/dev-api/PileManager': {target: 'http://personalpile.admin.usteu.com/',changeOrigin: true,rewrite: (path) => path.replace(/^\/dev-api/, '')},// 本地后端服務的代理配置"/dev-api": {target: "http://localhost:8050/",changeOrigin: true,rewrite: path => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '/api')}},
}

首先我們要理解,為什么需要代理。當你的前端項目運行在http://localhost:7001(由 port 指定),而后端接口部署在另一個域名或端口(比如http://localhost:8050)時,由于瀏覽器的同源策略限制,直接請求會被攔截。代理的作用就是讓前端請求先發送到本地的 Vite 開發服務器,再由 Vite 服務器轉發到目標后端服務器,這樣就避開了瀏覽器的跨域限制。

我們來看 proxy 對象中的具體配置。這里定義了兩組代理規則,每組規則都是一個鍵值對。鍵表示需要被代理的請求路徑前綴,而值則是該前綴對應的代理配置。

先看第一個代理規則’/dev-api/PileManager’。當你的代碼中發起類似fetch(‘/dev-api/PileManager/some/path’)的請求時,Vite 會攔截這個請求,并按照配置進行處理。target 指定了目標服務器的地址,這里是http://personalpile.admin.usteu.com/,意味著這個請求會被轉發到該服務器。

changeOrigin 設置為 true 是一個很重要的配置,它表示在發送請求到目標服務器時,會修改請求頭中的 Origin 字段,讓目標服務器以為請求來自于它自己所在的域,從而避免一些服務器可能存在的域名驗證限制。

rewrite 則用于修改請求路徑。這里的path.replace(/^/dev-api/, ‘’)表示會把請求路徑中開頭的/dev-api去掉。原來的請求路徑是/dev-api/PileManager/some/path,經過重寫后就變成了/PileManager/some/path,然后再拼接上 target 的地址,最終請求的實際地址就是http://personalpile.admin.usteu.com/PileManager/some/path。

再看第二個代理規則"/dev-api"。這里你可能會疑惑,它的路徑前綴看起來和第一個規則有重疊,為什么能正常工作?這是因為 Vite 在匹配代理規則時,會優先選擇更具體、更長的路徑前綴。只有當請求路徑不匹配第一個規則時,才會匹配這個更通用的規則。

這個規則的 target 設置為本地的http://localhost:8050/,通常這是開發者自己的后端服務。rewrite 這里使用了env.VITE_APP_BASE_API,這是一個從環境變量中獲取的值,通常也是/dev-api。所以這個重寫規則的意思是,把請求路徑中開頭的/dev-api替換成/api。比如原來的請求是/dev-api/user/list,重寫后就變成了/api/user/list,最終請求的實際地址是http://localhost:8050/api/user/list。

通過這樣的代理配置,前端開發者就不需要在代碼中硬編碼不同環境的接口地址,也不需要擔心開發階段的跨域問題。Vite 會自動幫我們完成請求的轉發和路徑的處理,讓我們可以專注于業務邏輯的開發。

需要注意的是,這些代理配置只在開發階段生效,因為它是 Vite 開發服務器提供的功能。當項目打包上線到生產環境時,通常會使用 Nginx 等服務器來配置類似的反向代理功能,以確保生產環境中的接口請求也能正常工作。

那么nginx大概應該怎么配置呢,如下示例:

location /dev-api/PileManager/ {proxy_pass http://personalpile.admin.usteu.com/PileManager/;proxy_set_header Host personalpile.admin.usteu.com;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;
}location /dev-api/ {proxy_pass http://127.0.0.1:8050/api/;# 連接增強配置client_max_body_size 1000m;send_timeout 3600s;keepalive_timeout 3600s;         # 保持連接活性(網頁7補充)keepalive_requests 10000;       # 單連接最大請求數# SSE核心配置proxy_http_version 1.1;          # 強制使用HTTP/1.1協議(網頁1、網頁6)proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";#關閉代理緩沖,確保實時傳輸proxy_buffering off;proxy_cache off;                # 關閉緩存防止數據截斷proxy_read_timeout 86400s;      # 24小時超時(網頁1建議值)proxy_set_header Cache-Control 'no-cache';add_header Cache-Control no-cache;# 頭信息增強proxy_set_header X-Accel-Buffering no;# 下面三句話是用來獲取用戶訪問的ip的proxy_set_header Host             $host;proxy_set_header X-Real-IP        $remote_addr;proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;proxy_set_header Last-Event-ID $http_last_event_id;# CORS跨域支持(網頁3、網頁5)add_header 'Access-Control-Allow-Origin' $http_origin always;add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;add_header 'Access-Control-Allow-Headers' 'Content-Type,Authorization,Last-Event-ID' always;add_header 'Access-Control-Expose-Headers' 'Content-Type,Content-Length' always;# 預檢請求處理(網頁2、網頁6)if ($request_method = OPTIONS) {add_header 'Access-Control-Max-Age' 1728000;add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Last-Event-ID';add_header 'Content-Type' 'text/plain; charset=utf-8';return 204;}
}

以上展示了當我們的前端需要調用其他第三方服務器的接口時,我們在本地開發環境和線上生產環境分別需要做的事,筆者展示了詳細的代理示例,希望給大家帶來參考價值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917102.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917102.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917102.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

理解梯度在神經網絡中的應用

梯度(Gradient)是微積分中的一個重要概念,廣泛應用于機器學習和深度學習中,尤其是在神經網絡的訓練過程中。下面將從梯度的基本概念、其在神經網絡中的應用兩個方面進行詳細介紹。一、梯度的基本概念 1.1 什么是梯度? …

WPF,按鈕透明背景實現MouseEnter

在幫手程序(assister.exe)中,可以點擊錄制按鈕,實現錄制用戶操作直接生成操作列表。而在彈出錄制按鈕的懸浮窗中,需要能夠拖動錄制按鈕放置在任意的位置,以免阻擋正常的窗口。具體功能是,當鼠標…

【抄襲】思科交換機DAI(動態ARP監控)配置測試

一.概述 1.DAI作用 ①.使用DAI,管理員可以指定交換機的端口為信任和非信任端口: 信任端口可以轉發任何ARP信息 非信任端口的ARP消息要進行ARP檢測驗證 ②.交換機執行如下的ARP驗證: 靜態ARP監控:為一個靜態的IP地址配置一個靜態AR…

在嵌入式系統或 STM32 平臺中常見的外設芯片和接口

在嵌入式系統或 STM32 平臺中常見的 外設芯片 或 模塊名稱,包括: 📺 顯示驅動(如 ST7735、OTM8009A、NT35510)📷 攝像頭模組(如 OV5640、OV9655、S5K5CAG)💾 Flash 存儲器…

AI 類型的 IDE

指集成了 AI 輔助編程能力的集成開發環境 一、代碼輔助生成 ? 自動補全(更智能) 比傳統 IDE 更智能,理解上下文,生成整個函數/模塊 示例:根據函數名 calculateTax 自動生成稅務計算邏輯 ? 函數 / 類自動生成 給…

JP3-3-MyClub后臺后端(一)

Java道經 - 項目 - MyClub - 后臺后端(一) 傳送門:JP3-1-MyClub項目簡介 傳送門:JP3-2-MyClub公共服務 傳送門:JP3-3-MyClub后臺后端(一) 傳送門:JP3-3-MyClub后臺后端(…

架構實戰——互聯網架構模板(“存儲層”技術)

目錄 一、SQL 二、NoSQL 三、小文件存儲 四、大文件存儲 本文來源:極客時間vip課程筆記 一、SQL SQL 即我們通常所說的關系數據。前幾年 NoSQL 火了一陣子,很多人都理解為 NoSQL 是完全拋棄關系數據,全部采用非關系型數據。但經過幾年的試驗后,大家發現關系數據不可能完全被…

CentOS7.9在線部署Dify

一、CentOS7.9安裝dify 二、檢查是否安裝dcoker docker --version2.1下載后將安裝包上傳至服務器對應文件夾下,我選在放在了 /root文件夾下 cd /root2.2 上傳至服務器 cd /root #對應目錄下tar -xvf docker-26.1.4.tgz # 解壓安裝包:chmod 755 -R docker # 賦予可執…

深入淺出C語言指針:從數組到函數指針的進階之路(中)

指針是C語言的靈魂,也是初學者最頭疼的知識點。它像一把鋒利的刀,用得好能大幅提升代碼效率,用不好則會讓程序漏洞百出。今天這篇文章,我們從數組與指針的基礎關系講起,一步步揭開指針進階類型的神秘面紗,最…

java web Cookie處理

java web 設置cookie更改啟動端口// Directory tree (5 levels) ├── src\ │ ├── a.txt │ └── com\ │ └── zhang\ │ └── ServletContext\ │ ├── cookie\ │ └── servletContext.java └── web\├─…

機器學習—線性回歸

一線性回歸線性回歸是利用數理統計中回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關系的一種統計分析方法。相關關系:包含因果關系和平行關系因果關系:回歸分析【原因引起結果,需要明確自變量和因變量】平行關系&#xff1…

Spring Boot Admin 監控模塊筆記-實現全鏈路追蹤

一、概述Spring Boot Admin(SBA)是一個用于監控和管理 Spring Boot 應用程序的工具。它提供了一個 Web 界面,可以集中管理多個 Spring Boot 應用程序的健康狀態、指標、日志、配置等信息。通過 SBA,你可以輕松地監控和管理你的微服…

容器化與Docker核心原理

目錄 專欄介紹 作者與平臺 您將學到什么? 學習特色 容器化與Docker核心原理 引言:為什么容器化成為云計算時代的基石? 容器化技術全景與Docker核心原理:從概念到實踐 文章摘要 1. 引言:為什么容器化成為云計算…

掌握Python三大語句:順序、條件與循環

PS不好意思各位,由于最近筆者在參加全國大學生電子設計大賽,所以最近會出現停更的情況,望大家諒解,比賽結束后我會加大力度,火速講Python的知識給大家寫完🎖?🎖?🎖?🎖…

JAVA結合AI

Java 與人工智能(AI)的結合正經歷從技術探索到深度融合的關鍵階段。以下從技術生態、應用場景、工具創新、行業實踐及未來趨勢五個維度展開分析,結合最新技術動態與企業級案例,揭示 Java 在 AI 時代的獨特價值與發展路徑。一、技術…

本土DevOps平臺Gitee如何重塑中國研發團隊的工作流

本土DevOps平臺Gitee如何重塑中國研發團隊的工作流 在數字化轉型浪潮席卷各行各業的當下,軟件開發效率已成為企業競爭力的核心指標。Gitee DevOps作為專為中國開發團隊打造的本土化研發管理平臺,正在改變國內技術團隊的工作方式。該平臺通過從代碼管理到…

5G MBS(組播廣播服務)深度解析:從標準架構到商用實踐

一、MBS技術背景與核心價值 1.1 業務需求驅動 隨著超高清視頻(4K/8K)、多視角直播、XR元宇宙應用爆發式增長,傳統單播傳輸面臨帶寬浪費(相同內容重復發送)與擁塞風險(萬人并發場景)的雙重挑戰。5G MBS通過點對多點(PTM)傳輸實現內容一次發送、多終端接收,頻譜效率提…

如何將照片從 realme 手機傳輸到電腦?

對于 realme 用戶來說,將照片傳輸到電腦可以有多種用途,從釋放設備空間到在單獨的存儲設備上創建備份。這個過程不僅有助于高效管理設備內存,還可以讓您利用電腦上強大的照片編輯軟件進行高級增強和創意項目。了解如何將照片從 realme 手機傳…

Centos 7部署.NET 8網站項目

簡介 本文詳細介紹了在CentOS 7系統上部署.NET 8網站項目的完整流程,主要內容包括:系統版本更新與檢查、PostgreSQL數據庫的安裝配置(含防火墻設置、數據庫初始化及遠程訪問配置)、Nginx Web服務的安裝與防火墻配置。文章通過分步…

Windows 11下IDEA中使用git突然變得卡慢及解決辦法

1. 表象 使用idea的git進行update、commit、push等操作時,極度卡慢。需等待幾十秒到幾分鐘。修改文件后,git刷新也不及時。update命令有時候無法點擊。 2.解決方法 停止PC Manager ServiceCtrl shift esc : 打開任務管理器找到服務: 服務中…