最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx 配置跨域的實現(xiàn)及常見問題解決

 更新時間:2025年06月17日 10:52:29   作者:頗有幾分姿色  
本文主要介紹了Nginx 配置跨域的實現(xiàn)及常見問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 跨域

1.1 同源策略

同源策略(Same-Origin Policy)是瀏覽器的一種安全機制,它限制了不同源之間的資源共享。兩個 URL 被認為是同源的,必須滿足以下三個條件:

  • 協(xié)議相同(如 http 或 https)
  • 域名相同
  • 端口相同

例如:

  • 同源:
    • http://example.com:8080 和 http://example.com:8080
  • 跨域:
    • http://example.com:8080 和 http://example.com:3000(端口不同)
    • http://example.com 和 https://example.com(協(xié)議不同)
    • http://example.com 和 http://api.example.com(域名不同)

1.2 跨域資源共享(CORS)

CORS 是一種機制,通過設(shè)置特定的 HTTP 響應(yīng)頭,允許瀏覽器訪問跨域資源。CORS 頭主要包括:

  • **Access-Control-Allow-Origin**:指定允許訪問的源。
  • **Access-Control-Allow-Methods**:指定允許的 HTTP 方法(如 GET, POST)。
  • **Access-Control-Allow-Headers**:指定允許的請求頭(如 Content-Type, Authorization)。
  • **Access-Control-Allow-Credentials**:是否允許攜帶 Cookie 或其他憑證。
  • **Access-Control-Max-Age**:預(yù)檢請求的緩存時間。

2. Nginx 配置跨域的場景

2.1 場景 1:簡單跨域請求

如果前端發(fā)送的是 簡單請求(如 GET 或 POST,且沒有自定義請求頭),Nginx 只需要在響應(yīng)中添加跨域頭即可。

2.2 場景 2:復(fù)雜跨域請求

如果前端發(fā)送的是 復(fù)雜請求(如 POST 請求包含 Content-Type: application/json 或自定義頭 Authorization 等),瀏覽器會先發(fā)起 預(yù)檢請求(OPTIONS),詢問服務(wù)器是否允許跨域。

Nginx 必須正確處理 OPTIONS 請求,并返回所有必要的跨域頭。

3. Nginx 配置跨域的完整實現(xiàn)

3.1 基礎(chǔ)跨域配置

基礎(chǔ)的 Nginx 跨域配置示例:

server {
  listen 8081;
  server_name localhost;

  # 根目錄(H5 前端文件)
  root /usr/share/nginx/html/applet/dist/build/h5/;

  # 跨域配置
  location /api/ {
    # 添加跨域頭
    add_header 'Access-Control-Allow-Origin' '*' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
    add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
    add_header 'Access-Control-Allow-Credentials' 'true' always;

    # 如果是預(yù)檢請求 (OPTIONS),直接返回成功
    if ($request_method = 'OPTIONS') {
      add_header 'Access-Control-Allow-Origin' '*' always;
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
      add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With';
      add_header 'Access-Control-Max-Age' 1800;
      add_header 'Content-Length' 0;
      add_header 'Content-Type' 'text/plain';
      return 204;
    }

    # 反向代理到后端服務(wù)
    proxy_pass url; # 替換為后端服務(wù)地址
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

3.2 配置解析

  • Access-Control-Allow-Origin:允許的跨域來源。如果后端需要支持多個來源,可以動態(tài)設(shè)置該值;或者使用 * 表示允許所有來源。
  • Access-Control-Allow-Methods:聲明支持的 HTTP 方法。
  • Access-Control-Allow-Headers:聲明允許的自定義請求頭。如果前端發(fā)送了 Authorization 或其他自定義頭,必須在這里明確聲明。
  • Access-Control-Max-Age:指定預(yù)檢請求的緩存時間,單位為秒(如 1800 表示緩存 30 分鐘)。
  • if ($request_method = 'OPTIONS'):單獨處理預(yù)檢請求,直接返回 204,避免請求被轉(zhuǎn)發(fā)到后端。
  • 在 if 判斷中直接返回響應(yīng)(如 return 204)的情況下,add_header** 需要在同一個 if 塊內(nèi)聲明**,否則不會被應(yīng)用到響應(yīng)中。這里主要是nginx的響應(yīng)流程和作用域特性。

3.3 動態(tài)配置跨域來源

3.3.1 常規(guī)配置

如果后端需要允許多個特定來源,可以通過 $http_origin 動態(tài)設(shè)置 Access-Control-Allow-Origin:

location /api/ {
  # 動態(tài)設(shè)置跨域來源
  set $cors "";
  if ($http_origin ~* (http://ip:port|http://example.com)) {
    set $cors $http_origin;
  }

  add_header 'Access-Control-Allow-Origin' $cors always;
  add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
  add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
  add_header 'Access-Control-Allow-Credentials' 'true' always;

  # 如果是預(yù)檢請求 (OPTIONS),直接返回成功
  if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Allow-Origin' $cors always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
    add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With';
    add_header 'Access-Control-Max-Age' 1800;
    add_header 'Content-Length' 0;
    add_header 'Content-Type' 'text/plain';
    return 204;
  }

  proxy_pass bakcendurl;
}

3.3.2 進階配置

Nginx 提供了 map指令,可用于根據(jù)請求條件動態(tài)設(shè)置變量。利用map指令提前設(shè)置變量,避免 if 指令的復(fù)雜嵌套,更安全地實現(xiàn)動態(tài)跨域邏輯。

# 動態(tài)設(shè)置允許的跨域來源
map $http_origin $cors_origin {
    default "";
    "~^https?://trusteddomain1\.com$" $http_origin;
    "~^https?://trusteddomain2\.com$" $http_origin;
}

# 動態(tài)設(shè)置緩存時間
map $http_origin $cors_max_age {
    default "0";
    "~^https?://trusteddomain1\.com$" "86400"; # 1 天
    "~^https?://trusteddomain2\.com$" "3600";  # 1 小時
}

server {
    listen 8081;
    server_name localhost;

    location ~* ^/(url|url1|……) {
        add_header 'Access-Control-Allow-Origin' "$cors_origin" always;
        add_header 'Vary' 'Origin' always;
       	add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
       	add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
		add_header 'Access-Control-Max-Age' "$cors_max_age" always; 

        # 特殊處理 OPTIONS 預(yù)檢請求
        if ($request_method = 'OPTIONS') {
			# 設(shè)置 CORS 響應(yīng)頭
       		add_header 'Access-Control-Allow-Origin' "$cors_origin" always;
       		add_header 'Vary' 'Origin' always;
       		add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
       		add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
			add_header 'Access-Control-Max-Age' "$cors_max_age" always; 

            add_header 'Content-Length' '0' always;
            add_header 'Content-Type' 'text/plain' always;
            return 204;
        }

        # 其他請求正常代理到后端服務(wù)
        proxy_pass backendurl;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 1024m;
        proxy_buffer_size 1024k;
        proxy_buffers 16 1024k;
        proxy_busy_buffers_size 2048k;
        proxy_temp_file_write_size 2048k;
    }
}

測試命令:

curl -X OPTIONS http://localhost:8081/api/test \
-H "Content-Type: application/json" \
-H "Origin: https://trusteddomain1.com" \
-H "Authorization: Bearer null" \
-I

結(jié)果:

域名1結(jié)構(gòu)

改為第二個域名,輸出結(jié)果:

域名2

配置成功。

4. 驗證跨域配置是否生效

4.1 使用 curl 驗證

預(yù)檢請求

運行以下命令,檢查 OPTIONS 請求的響應(yīng)頭是否包含正確的跨域頭:

curl -X OPTIONS http://localhost:8081/api/test-endpoint \
-H "Origin: yoururl" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: Content-Type, Authorization" -I

實際請求

運行以下命令,檢查實際請求的跨域頭:

curl -X POST http://localhost:8081/api/test-endpoint \
-H "Origin: yoururl" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{"key":"value"}' -I

將Origin的值替換即可。

5. 常見問題及解決方法

5.1 No 'Access-Control-Allow-Origin' header is present on the requested resource

  • 原因:后端未返回 Access-Control-Allow-Origin。
  • 解決:檢查 Nginx 或后端服務(wù)是否返回了正確的跨域頭。

5.2 Request header field <header_name> is not allowed by Access-Control-Allow-Headers

  • 原因:前端發(fā)送了未被允許的自定義請求頭。
  • 解決:在 Access-Control-Allow-Headers 中添加該頭(如 Authorization, channel 等)。

5.3 OPTIONS 請求返回 404 或 405

  • 原因:Nginx 或后端未正確處理 OPTIONS 請求。
  • 解決:在 Nginx 配置中使用 if ($request_method = 'OPTIONS') 單獨處理預(yù)檢請求。

6. 注意事項

(1) 不建議長期使用通配符 *

  • 如果前端需要發(fā)送 Authorization 或 Cookie,不能使用通配符 *,需要指定具體的跨域來源:
add_header 'Access-Control-Allow-Origin' 'http://ip:port' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;

(2) 確保前端請求頭與后端配置匹配

  • 如果前端發(fā)送了自定義頭(如 channel),后端的 Access-Control-Allow-Headers 必須包含這些頭。

(3) 確保后端不會覆蓋 Nginx 的跨域頭

  • 如果后端服務(wù)也返回了跨域頭,可能會覆蓋 Nginx 的配置??梢酝ㄟ^ proxy_hide_header 移除后端返回的頭:
proxy_hide_header Access-Control-Allow-Origin;
proxy_hide_header Access-Control-Allow-Methods;
proxy_hide_header Access-Control-Allow-Headers;

7. 總結(jié)

  • CORS 的核心在于配置正確的跨域頭(Access-Control-Allow-*)。
  • Nginx 配置跨域的關(guān)鍵點:
    • 處理預(yù)檢請求(OPTIONS)。
    • 添加必要的跨域頭(Access-Control-Allow-Origin, Access-Control-Allow-Headers 等)。
    • 確??缬蝾^在所有響應(yīng)中生效(使用 always 參數(shù))。
  • 使用工具(如 curl 或瀏覽器開發(fā)者工具)驗證跨域配置是否正確。

到此這篇關(guān)于Nginx 配置跨域的實現(xiàn)及常見問題解決的文章就介紹到這了,更多相關(guān)Nginx 配置跨域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nginx?增加nginx_lua_module模塊的方法實現(xiàn)

    nginx?增加nginx_lua_module模塊的方法實現(xiàn)

    本文詳細介紹了在NGINX?V1.14.0上安裝lua-nginx-module模塊的過程,包括LuaJIT2.1、ngx_devel_kit?V0.3.0和lua_nginx_module?V0.10.13的安裝步驟,感興趣的可以了解一下
    2026-05-05
  • nginx配置靜態(tài)文件服務(wù)器詳解

    nginx配置靜態(tài)文件服務(wù)器詳解

    本篇文章主要介紹了nginx配置靜態(tài)文件服務(wù)器詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Nginx的反向代理實例詳解

    Nginx的反向代理實例詳解

    這篇文章主要介紹了Nginx的反向代理實例詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • nginx請求限制配置方法

    nginx請求限制配置方法

    這篇文章給大家介紹nginx請求限制配置方法,包括http協(xié)議的連接和請求,nginx配置語法,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2021-07-07
  • nginx如何設(shè)置服務(wù)器響應(yīng)時間長短

    nginx如何設(shè)置服務(wù)器響應(yīng)時間長短

    本文主要介紹了nginx如何設(shè)置服務(wù)器響應(yīng)時間長短,主要介紹了兩種方法,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 使用nginx.exe時閃退的原因和解決方法

    使用nginx.exe時閃退的原因和解決方法

    最近使用老師給的nginx.exe時,點擊nginx.exe突然屏幕就閃一下,經(jīng)過一番排查,發(fā)現(xiàn)是端口被占用所導(dǎo)致的,所以本文就給大家講講端口被占用時的解決方法詳細步驟,需要的朋友可以參考下
    2023-07-07
  • 在Nginx服務(wù)器上屏蔽IP的一些基本配置方法分享

    在Nginx服務(wù)器上屏蔽IP的一些基本配置方法分享

    這篇文章主要介紹了在Nginx服務(wù)器上屏蔽IP的一些基本配置方法分享,包括對過多訪問的IP配置腳本屏蔽等一些小技巧,的朋友可以參考下
    2015-12-12
  • 詳解nginx進程鎖的實現(xiàn)

    詳解nginx進程鎖的實現(xiàn)

    nginx是多進程并發(fā)模型的應(yīng)用,但為了網(wǎng)絡(luò)請求的安全性,必須要使用到鎖,那么這個進程鎖如何實現(xiàn)呢
    2021-06-06
  • Nginx實戰(zhàn)之反向代理WebSocket的配置實例

    Nginx實戰(zhàn)之反向代理WebSocket的配置實例

    最近在工作中遇到一個需求,需要使用 nginx 反向代理websocket,經(jīng)過查找一番資料,目前已經(jīng)測試通過,所以這篇文章主要給大家介紹了Nginx反向代理WebSocket配置的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • 詳解如何部署H5游戲到nginx服務(wù)器

    詳解如何部署H5游戲到nginx服務(wù)器

    這篇文章主要介紹了詳解如何部署H5游戲到nginx服務(wù)器,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05

最新評論

枣强县| 平江县| 中西区| 江都市| 西林县| 天祝| 房产| 西林县| 武鸣县| 娄底市| 兴城市| 耒阳市| 武宁县| 镶黄旗| 夏河县| 宁海县| 富裕县| 黎平县| 长宁区| 临猗县| 随州市| 图木舒克市| 长汀县| 吉林省| 巩义市| 江口县| 房山区| 肃宁县| 乌兰浩特市| 绥宁县| 西城区| 岑巩县| 项城市| 义马市| 长岛县| 佛教| 和田县| 泾阳县| 罗平县| 韶山市| 塔城市|