前端開發
Nuxt 2 解決 CORS:用 @nuxtjs/proxy 把 Nuxt 當成代理伺服器
記錄後端沒有提供 CORS 標頭時,串接 API 遇到跨域錯誤的解法——安裝 @nuxtjs/proxy,讓瀏覽器改向 Nuxt 自己的 web server 發請求,再由 Nuxt 伺服器去跟真正的後端要資料,繞開瀏覽器的同源限制。
W
串接後端 API 時遇到 CORS 問題。
什麼是 CORS
CORS(Cross-Origin Resource Sharing,跨域資源共享)是瀏覽器基於安全性考量的限制:載入其他網域的資源時,除非對方伺服器明確用回應標頭表示允許,不然瀏覽器會擋下這個請求。Firefox 跟 Chrome 對這個錯誤都有各自的提示訊息,但本質上是同一件事——後端沒有回傳允許跨域的標頭。
解法:讓 Nuxt 自己的伺服器當代理
瀏覽器的同源限制只針對「瀏覽器直接發出的跨網域請求」,伺服器對伺服器的請求不受這個限制。 解法是讓瀏覽器只跟「提供網頁的那台伺服器」(也就是 Nuxt 自己)要資料,再由 Nuxt 的伺服器去跟真正的後端 API 要資料,轉手一次繞過瀏覽器端的限制。
安裝
npm install @nuxtjs/proxy
nuxt.config.js 設定:
export default {
modules: ['@nuxtjs/proxy'],
proxy: {
'/api/': {
target: 'https://backend.example.com',
pathRewrite: { '^/api/': '' },
},
},
};
設定完成後,前端請求打 /api/posts,實際上會被 Nuxt 的伺服器轉發到 https://backend.example.com/posts,瀏覽器全程只跟同一個網域(Nuxt 自己)溝通,不會觸發 CORS 檢查。
現在還適用嗎
@nuxtjs/proxy 是 Nuxt 2 專屬的模組,Nuxt 3 之後的架構(Nitro)本身就是一個功能完整的伺服器,不需要額外裝模組來做代理,直接用 Nitro 的 server routes 就能達成同樣的效果,而且能力更完整(能順便做金鑰隱藏、回應快取這些事)。整理在《Nuxt 3 用 server routes 做代理與轉發》。