如何配置nginx解決前端跨域請求問題

我們以一個簡單的例子模擬不同情況下產生的跨域問題以及解決方案。假設在http://127.0.0.1:8000的頁面調用接口

fetch('http://127.0.0.1:8003/api/data')

常看到的錯誤“Access to fetch at ‘http://127.0.0.1:8003/api/data’ from origin ‘http://localhost:8000’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.”。這說明前端嘗試訪問的 API 服務,沒有正確配置跨域資源共享(CORS)頭。按如下配置:


server {listen 8003;server_name yourdomain.com;location / {# 允許所有來源訪問(生產環境應限制為特定域名)add_header 'Access-Control-Allow-Origin' '*';# 允許的請求方法add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';     # 允許的請求頭add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';# 預檢請求(OPTIONS)緩存時間add_header 'Access-Control-Max-Age' 1728000;}
}

并重新加載配置nginx -s reload,問題解決。接下來,我們對請求參數做下修改,并重新發起請求:

var options = {method: 'GET', // 請求類型headers: {'Custom-Header': '123', // 自定義header參數}
}
fetch('http://127.0.0.1:8003/api/data',options)

Access to fetch at ‘http://127.0.0.1:8003/api/data’ from origin ‘http://localhost:8000’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
HTTP 請求根據是否觸發 CORS 預檢(Preflight)分為 簡單請求(Simple Request) 和 復雜請求(Complex Request)。它們的核心區別在于瀏覽器是否會先發送 OPTIONS 預檢請求。 因為我們在請求頭里增加了的參數Custom-Header,這樣請求就從一個簡單請求變成了復雜請求。上述錯誤顯示預請求失敗,我們重新修改nginx配置:


http {include       mime.types;default_type  application/octet-stream;map $http_origin $cors_origin {default "*";  # 默認值(如果 $http_origin 不存在)"~^https?://(localhost|example\.com|sub\.example\.com)(:[0-9]+)?$" $http_origin;"~^http?://(localhost|example\.com|sub\.example\.com)(:[0-9]+)?$" $http_origin;}server {listen       8003;server_name  localhost;location /api/data {add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';     add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Max-Age' 1728000; # 預檢緩存20天if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' $cors_origin;add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}# 允許所有來源訪問(生產環境應限制為特定域名)add_header 'Access-Control-Allow-Origin' '*';alias /Users/wk/data.json;default_type application/json;add_header Cache-Control "no-cache";}}

再發請求剛才的問題解決了,但又出現了新問題:
Access to fetch at ‘http://127.0.0.1:8003/api/data’ from origin ‘http://localhost:8000’ has been blocked by CORS policy: Request header field custom-header is not allowed by Access-Control-Allow-Headers in preflight response.”。
說明Access-Control-Allow-Headers不允許header里包含custom-header參數,需要在Access-Control-Allow-Headers里增加custom-header參數。注意Access-Control-Allow-Headers一定要放到if ($request_method = ‘OPTIONS’)語句內,否則不生效。因為CORS 配置的特殊要求,順序尤為重要,預檢請求(OPTIONS) 的響應頭必須完整。

server {listen       8003;server_name  localhost;location /api/data {add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';     add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Max-Age' 1728000; # 預檢緩存20天if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' $cors_origin;add_header 'Access-Control-Allow-Headers' 'Content-Type, Custom-Header,Authorization';add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}# 允許所有來源訪問(生產環境應限制為特定域名)add_header 'Access-Control-Allow-Origin' '*';alias /Users/wk/data.json;default_type application/json;add_header Cache-Control "no-cache";}}

上述問題得以解決。我們再改下請求參數,增加 credentials: “include”。:


var options = {method: 'GET', // 請求類型credentials: "include",headers: {'Custom-Header': '123', // 自定義header參數'Content-Type': 'application/json' // 通常需要設置的內容類型}
}
fetch('http://127.0.0.1:8003/api/data',options)

credentials: “include” 的作用是:控制發送憑據,在跨域請求中攜帶當前域的 cookies、HTTP 認證頭(如 Authorization)等敏感信息。但它有特殊要求,服務器需顯式允許響應頭包含 Access-Control-Allow-Credentials: true,Access-Control-Allow-Origin 不能為通配符 ,必須明確指定請求來源域名。否則就會錯誤類似的錯誤:
Access to fetch at ‘http://127.0.0.1:8003/api/data’ from origin ‘http://127.0.0.1:8000’ has been blocked by CORS policy: The value of the ‘Access-Control-Allow-Origin’ header in the response must not be the wildcard '
’ when the request’s credentials mode is ‘include’。
解決方法:

http {include       mime.types;default_type  application/octet-stream;map $http_origin $cors_origin {default "*";  # 默認值(如果 $http_origin 不存在)"~^https?://(localhost|example\.com|sub\.example\.com)(:[0-9]+)?$" $http_origin;"~^http?://(localhost|example\.com|sub\.example\.com)(:[0-9]+)?$" $http_origin;}server {listen       8003;server_name  localhost;location /api/data {add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';     add_header 'Access-Control-Allow-Origin' $cors_origin;add_header 'Access-Control-Max-Age' 1728000; # 預檢緩存20天if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' $cors_origin;add_header 'Access-Control-Allow-Headers' 'custom-header, content-type, authorization';add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}add_header 'Access-Control-Allow-Credentials' 'true';alias /Users/wk/data.json;default_type application/json;add_header Cache-Control "no-cache";}}

總結配置nginx支持跨域請求需要注意的幾個要點

  1. 基礎 CORS 頭配置,必須返回的頭部:
add_header 'Access-Control-Allow-Origin' '$http_origin';  # 或指定具體域名
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';  # 按需擴展
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';  # 包含客戶端實際使用的頭
Allow-Origin 不能同時使用 * 和 Allow-Credentials: true。
Allow-Methods 和 Allow-Headers 需明確列出(不能為 *)。
  1. 預檢請求(OPTIONS)處理
if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' '$http_origin';add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, OPTIONS';  # 與方法列表一致add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Custom-Header';add_header 'Access-Control-Max-Age' 86400;  # 預檢緩存時間(秒)return 204;  # 空響應
}
  1. 帶憑據的請求(Credentials)
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Origin' $http_origin;  # 動態獲取域名

Access-Control-Allow-Origin明確域名,不能用 *。Cookie 需設置 SameSite=None; Secur(HTTPS 環境)。

  1. 動態來源管理,使用 map 匹配合法來源:
map $http_origin $cors_origin {default "";"~^https://(www\.)?example\.com$" $http_origin;"~^http://localhost(:\d+)?$" $http_origin;
}
server {add_header 'Access-Control-Allow-Origin' $cors_origin;
}

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

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

相關文章

React Hooks 指南:何時使用 useEffect ?

在 React 的函數組件中,useEffect Hook 是一個強大且不可或缺的工具。它允許我們處理副作用 (side effects)——那些在組件渲染之外發生的操作。但是,什么時候才是使用 useEffect 的正確時機呢?讓我們深入探討一下! 什么是副作用…

bat批量去掉本文件夾中的文件擴展名

本文本夾內 批量去掉本文件夾中的文件擴展名 假如你有一些文件,你想去掉他們的擴展名 有沒有方便的辦法呢 今天我們就分享一種辦法。 下面,就來看看吧。 首先我們新建一個記事本,把名字改為,批量去掉本文件夾中的文件擴展名.txt 然…

STM32標準庫-輸入捕獲

一、輸入捕獲 1.簡介 IC(Input Capture)輸入捕獲輸入 捕獲模式下,當通道輸入引腳出現指定電平跳變時,當前CNT的值將被鎖存到CCR中,可用于測量PWM波形的頻率、占空比、脈沖間隔、電平持續時間等參數 每個高級定時器和…

在linux系統上搭建git服務器(ssh協議)

1.在windows上生成RSA密鑰對 ssh-keygen -t rsa -b 2048 -C"git用戶名/郵箱地址" 命令執行后會在 C:\Users\${windows登錄賬戶}\.ssh 目錄下生成密鑰對 其中 id_rsa 為私鑰,id_rsa.pub 為公鑰 2.在 linux 系統上登記公鑰 vim ~/.ssh/authorized_keys…

RAG檢索系統的兩大核心利器——Embedding模型和Rerank模型

在RAG系統中,有兩個非常重要的模型一個是Embedding模型,另一個則是Rerank模型;這兩個模型在RAG中扮演著重要角色。 Embedding模型的作用是把數據向量化,通過降維的方式,使得可以通過歐式距離,余弦函數等計算…

stm32內存踩踏一例

1、問題描述 程序運行過程中,發現顯示的內容亂了,如下圖所示: 2、問題分析 此原因產生是由于將一個函數提前引起的,單步跟蹤檢查問題 運行過此函數后變量的地址改變了?被調函數能改變調用函數的變量地址&#xff1f…

Selenium的底層原理

Selenium 底層主要依賴于 WebDriver 協議(即 W3C WebDriver 規范,早期也有 JSON Wire Protocol)來實現對瀏覽器的遠程控制,其核心架構可以分為以下幾層: Selenium 客戶端(Client Library) 支持多…

前端高頻面試題2:瀏覽器/計算機網絡

本專欄相關鏈接 前端高頻面試題1:HTML/CSS 前端高頻面試題2:瀏覽器/計算機網絡 前端高頻面試題3:JavaScript 1.什么是強緩存、協商緩存? 強緩存: 當瀏覽器請求資源時,首先檢查本地緩存是否命中。如果命…

MATLAB-電偶極子所產出的電磁場仿真

% 清除工作區 clear all % 用戶輸入 a input(輸入點電荷的位置如[1,0,1;2,0,2]表示位置在(1,0,1),(2,0,2): ); Q input(輸入點電荷的電荷量,-表示電性,如[1,-1]: ); a1 input(電場線角度間隔: ); % 角度間隔 % 設置繪圖范圍 xmin min(a(:,1)) - 4;…

混合云數據庫連接問題:本地與云實例的兼容性挑戰

關鍵詞:混合云數據庫,混合云架構,數據庫連接問題,網絡策略,兼容性挑戰,權限沖突,防火墻,VPN,ExpressRoute,Direct Connect,SQL Server,MySQL,PostgreSQL,Azure SQL Database,AWS RDS 隨著企業數字化轉型的深入,混合云架構正成為主流選擇。它結合了本地數據中心…

pikachu靶場通關筆記16 CSRF關卡02-CSRF(POST)

目錄 一、CSRF原理 二、源碼分析 三、滲透實戰 1、構造CSRF鏈接 (1)登錄 (2)bp設置inception on (3)修改個人信息 (4)構造CSRF鏈接 2、模擬受害者登錄 3、誘導受害者點擊 …

CAD2025安裝教程與資源下載

軟件下載 軟件名稱:CAD2025軟件語言:簡體中文軟件大小:2.69G系統要求:Windows10或更高,32/ 64位操作系統硬件要求:CPU2GHz ,RAM4G或更高下載鏈接: 鏈接:https://pan.qua…

SpringBoot離線應用的5種實現方式

在當今高度依賴網絡的環境中,離線應用的價值日益凸顯。無論是在網絡不穩定的區域運行的現場系統,還是需要在斷網環境下使用的企業內部應用,具備離線工作能力已成為許多應用的必備特性。 本文將介紹基于SpringBoot實現離線應用的5種不同方式。…

數據類型 -- 字符

在C中,字符型(char)用于存儲單個字符,如字母、數字、符號等。字符型是最基本的數據類型之一,常用于處理文本、字符數組(字符串)等場景。 1. 基本類型 ? char:標準字符類型&#x…

國標GB28181視頻平臺EasyGBS視頻實時監控系統打造換熱站全景可視化管理方案

一、方案背景? 在城市供熱體系中,換熱站作為連接熱源與用戶的核心樞紐,其運行穩定性直接影響供熱質量。面對供熱規模擴大與需求升級,傳統人工巡檢模式暴露出效率低、響應慢、監測不足等問題。基于GB28181協議的EasyGBS視頻實時監控系統&…

174頁PPT家居制造業集團戰略規劃和運營管控規劃方案

甲方集團需要制定一個清晰的集團價值定位,從“指引多元”、“塑造 能力”以及“強化協同”等方面引領甲方做大做強 集團需要通過管控模式、組織架構及職能、授權界面、關鍵流程、戰略 實施和組織演進路徑,平衡風險控制和迅速發展,保證戰略落地…

python打卡第45天

tensorboard的發展歷史和原理 一、發展歷史 起源與 TensorFlow 一同誕生 (2015年底): TensorBoard 最初是作為 TensorFlow 開源項目(2015年11月發布)的一部分而設計和開發的。其核心目標是解決深度學習模型訓練過程中的“黑盒”問題,提供直觀…

CentOS 7如何編譯安裝升級gcc至7.5版本?

CentOS 7如何編譯安裝升級gcc版本? 由于配置CentOS-SCLo-scl.repo與CentOS-SCLo-scl-rh.repo后執行yum install -y devtoolset-7安裝總是異常,遂決定編譯安裝gcc7.5 # 備份之前的yum .repo文件至 /tmp/repo_bak 目錄 mkdir -p /tmp/repo_bak && cd /etc…

中山大學美團港科大提出首個音頻驅動多人對話視頻生成MultiTalk,輸入一個音頻和提示,即可生成對應唇部、音頻交互視頻。

由中山大學、美團、香港科技大學聯合提出的MultiTalk是一個用于音頻驅動的多人對話視頻生成的新框架。給定一個多流音頻輸入和一個提示,MultiTalk 會生成一個包含提示所對應的交互的視頻,其唇部動作與音頻保持一致。 相關鏈接 論文:https://a…

iOS 門店營收表格功能的實現

iOS 門店營收表格功能實現方案 核心功能需求 數據展示:表格形式展示門店/日期維度的營收數據排序功能:支持按營收金額、增長率等排序篩選功能:按日期范圍/門店/區域篩選交互操作:點擊查看詳情、數據刷新數據可視化:關…