欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Nginx代理解決跨域問(wèn)題并傳遞請(qǐng)求頭的完整指南

 更新時(shí)間:2025年01月17日 08:51:24   作者:碼農(nóng)阿豪@新空間代碼工作室  
在現(xiàn)代 Web 開發(fā)中,跨域資源共享(CORS)是一個(gè)常見的問(wèn)題,當(dāng)你的前端應(yīng)用嘗試從一個(gè)域名請(qǐng)求另一個(gè)域名的資源時(shí),瀏覽器會(huì)阻止這種請(qǐng)求,除非目標(biāo)服務(wù)器明確允許跨域訪問(wèn),本文將詳細(xì)介紹如何使用 Nginx 作為代理服務(wù)器來(lái)解決跨域問(wèn)題,需要的朋友可以參考下

引言

在現(xiàn)代 Web 開發(fā)中,跨域資源共享(CORS)是一個(gè)常見的問(wèn)題。當(dāng)你的前端應(yīng)用嘗試從一個(gè)域名請(qǐng)求另一個(gè)域名的資源時(shí),瀏覽器會(huì)阻止這種請(qǐng)求,除非目標(biāo)服務(wù)器明確允許跨域訪問(wèn)。為了解決這個(gè)問(wèn)題,開發(fā)者通常會(huì)使用代理服務(wù)器來(lái)轉(zhuǎn)發(fā)請(qǐng)求,從而繞過(guò)瀏覽器的同源策略。

本文將詳細(xì)介紹如何使用 Nginx 作為代理服務(wù)器來(lái)解決跨域問(wèn)題,并確保前端請(qǐng)求頭(如 Cookie、User-Agent、Accept 等)能夠正確傳遞到目標(biāo)服務(wù)器。我們將從 Nginx 的基本配置開始,逐步深入,最終形成一個(gè)完整的解決方案。

1. 什么是跨域問(wèn)題?

跨域問(wèn)題是由瀏覽器的同源策略引起的。同源策略要求瀏覽器只能允許來(lái)自同一域名的請(qǐng)求,而阻止來(lái)自其他域名的請(qǐng)求。具體來(lái)說(shuō),如果前端應(yīng)用的域名是 http://localhost:8080,而目標(biāo) API 的域名是 http://travel.yundasys.com:31432,那么瀏覽器會(huì)阻止這種跨域請(qǐng)求。

1.1 跨域問(wèn)題的表現(xiàn)

當(dāng)你嘗試從前端發(fā)起跨域請(qǐng)求時(shí),瀏覽器會(huì)返回類似以下的錯(cuò)誤:

Access to XMLHttpRequest at 'http://travel.yundasys.com:31432/interface/orderPhone?txm=320328706913678&type=1' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

1.2 解決跨域問(wèn)題的常見方法

  • CORS 頭配置:在目標(biāo)服務(wù)器上配置 Access-Control-Allow-Origin 頭,允許特定域名的跨域請(qǐng)求。
  • JSONP:通過(guò)動(dòng)態(tài)創(chuàng)建 <script> 標(biāo)簽繞過(guò)跨域限制,但只支持 GET 請(qǐng)求。
  • 代理服務(wù)器:使用代理服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求,從而繞過(guò)瀏覽器的同源策略。

本文將重點(diǎn)介紹如何使用 Nginx 作為代理服務(wù)器來(lái)解決跨域問(wèn)題。

2. 使用 Nginx 作為代理服務(wù)器

Nginx 是一個(gè)高性能的 HTTP 服務(wù)器和反向代理服務(wù)器。通過(guò)配置 Nginx,我們可以將前端的請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器,并在響應(yīng)中添加必要的 CORS 頭,從而解決跨域問(wèn)題。

2.1 Nginx 的基本配置

以下是一個(gè)簡(jiǎn)單的 Nginx 配置文件示例:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

在這個(gè)配置中,Nginx 監(jiān)聽 80 端口,并將請(qǐng)求轉(zhuǎn)發(fā)到本地的 html 目錄。

2.2 添加跨域支持

為了支持跨域請(qǐng)求,我們需要在 Nginx 配置中添加以下內(nèi)容:

server {
    listen       80;
    server_name  localhost;

    # 支持跨域的配置
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
    add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

    location / {
        root   html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

在這個(gè)配置中,我們添加了 add_header 指令來(lái)設(shè)置 CORS 頭,允許所有域名的跨域請(qǐng)求。

3. 配置 Nginx 代理傳遞請(qǐng)求頭

默認(rèn)情況下,Nginx 會(huì)將客戶端(瀏覽器)發(fā)送的請(qǐng)求頭(如 Accept、Cookie、User-Agent 等)轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器。然而,如果你在 Nginx 配置中顯式地設(shè)置了某些請(qǐng)求頭(如 Host、X-Real-IP 等),可能會(huì)覆蓋或刪除原始請(qǐng)求頭。

為了確保所有請(qǐng)求頭能夠正確傳遞到目標(biāo)服務(wù)器,我們需要調(diào)整 Nginx 配置。

3.1 修改后的 Nginx 配置

以下是修改后的 Nginx 配置,確保所有請(qǐng)求頭都被正確傳遞:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        # 支持跨域的配置
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

        location / {
            root   html;
            index  index.html index.htm;
        }

        # 代理 API 請(qǐng)求
        location /api/ {
            proxy_pass http://travel.yundasys.com:31432/;  # 替換為你的 API 服務(wù)器地址

            # 保留原始請(qǐng)求頭
            proxy_pass_request_headers on;

            # 設(shè)置必要的代理頭
            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 X-Forwarded-Proto $scheme;

            # 如果需要傳遞原始 Cookie,確保不覆蓋 Cookie 頭
            proxy_set_header Cookie $http_cookie;

            # 如果需要傳遞原始 User-Agent,確保不覆蓋 User-Agent 頭
            proxy_set_header User-Agent $http_user_agent;

            # 如果需要傳遞原始 Accept,確保不覆蓋 Accept 頭
            proxy_set_header Accept $http_accept;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

3.2 關(guān)鍵改動(dòng)說(shuō)明

  1. proxy_pass_request_headers on;

    • 這是默認(rèn)行為,確保所有客戶端請(qǐng)求頭都被傳遞到目標(biāo)服務(wù)器。
    • 如果你沒有顯式覆蓋某些請(qǐng)求頭,這一步可以省略。
  2. proxy_set_header

    • 使用 proxy_set_header 設(shè)置必要的代理頭(如 Host、X-Real-IP 等)。
    • 對(duì)于需要保留的原始請(qǐng)求頭(如 Cookie、User-Agent、Accept),使用 $http_<header_name> 變量傳遞原始值。
  3. $http_<header_name>

    • $http_cookie:傳遞原始 Cookie 頭。
    • $http_user_agent:傳遞原始 User-Agent 頭。
    • $http_accept:傳遞原始 Accept 頭。

4. 驗(yàn)證請(qǐng)求頭是否被正確傳遞

為了確保請(qǐng)求頭被正確傳遞到目標(biāo)服務(wù)器,你可以通過(guò)以下方式驗(yàn)證:

  1. 檢查目標(biāo)服務(wù)器的日志

    • 在目標(biāo)服務(wù)器上查看日志,確認(rèn)接收到的請(qǐng)求頭是否與前端發(fā)送的一致。
  2. 使用調(diào)試工具

    • 在 Nginx 中啟用調(diào)試日志,查看請(qǐng)求頭是否被正確轉(zhuǎn)發(fā):
error_log /var/log/nginx/error.log debug;

在 Nginx 中記錄請(qǐng)求頭

  • 在 Nginx 配置中添加日志記錄,輸出請(qǐng)求頭:
location /api/ {
    proxy_pass http://travel.yundasys.com:31432/;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # 記錄請(qǐng)求頭
    add_header X-Debug-Request-Headers "$http_user_agent $http_cookie";
}

5. 前端代碼的調(diào)整

如果你使用了 Nginx 代理,前端代碼中的 url 需要改為代理地址。例如:

// 目標(biāo) URL(改為 Nginx 代理地址)
const url = "http://your-nginx-server/api/interface/orderPhone?txm=320328706913678&type=1";

// 請(qǐng)求頭
const headers = {
  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
  "Accept-Language": "zh-CN,zh;q=0.9",
  "Cache-Control": "max-age=0",
  "Connection": "keep-alive",
  "Cookie": "CASTGC=TGT-37528572-jMiSLXk2PqxLEdKk2lxzXfSwgfo5MYa3MdD; SESSION=OTdiOTQ4NDQtY2M2ZC00NmVjLTgwZmItNzMzNDVjZDlmNmU4",
  "DNT": "1",
  "Upgrade-Insecure-Requests": "1",
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
};

// 發(fā)起請(qǐng)求
fetch(url, {
  method: "GET", // 請(qǐng)求方法
  headers: headers, // 請(qǐng)求頭
  credentials: "include" // 包含 Cookie
})
  .then(response => {
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return response.text(); // 解析響應(yīng)為文本
  })
  .then(data => {
    console.log("Response data:", data); // 輸出響應(yīng)數(shù)據(jù)
  })
  .catch(error => {
    console.error("Error:", error); // 捕獲錯(cuò)誤
  });

6. 總結(jié)

通過(guò)本文的介紹,我們?cè)敿?xì)講解了如何使用 Nginx 作為代理服務(wù)器來(lái)解決跨域問(wèn)題,并確保前端請(qǐng)求頭能夠正確傳遞到目標(biāo)服務(wù)器。以下是關(guān)鍵點(diǎn)總結(jié):

  1. 跨域問(wèn)題的本質(zhì):瀏覽器的同源策略阻止了跨域請(qǐng)求。
  2. Nginx 代理的作用:通過(guò)代理服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求,繞過(guò)瀏覽器的同源策略。
  3. Nginx 配置的關(guān)鍵點(diǎn)
    • 使用 add_header 設(shè)置 CORS 頭。
    • 使用 proxy_set_header 傳遞原始請(qǐng)求頭。
  4. 驗(yàn)證請(qǐng)求頭:通過(guò)日志和調(diào)試工具確保請(qǐng)求頭被正確傳遞。
  5. 前端代碼的調(diào)整:將目標(biāo) URL 改為代理地址。

到此這篇關(guān)于使用Nginx代理解決跨域問(wèn)題并傳遞請(qǐng)求頭的完整指南的文章就介紹到這了,更多相關(guān)Nginx解決跨域問(wèn)題并傳遞請(qǐng)求頭內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Nginx搭建代理服務(wù)器(正向代理HTTPS網(wǎng)站)的操作指南

    使用Nginx搭建代理服務(wù)器(正向代理HTTPS網(wǎng)站)的操作指南

    在網(wǎng)絡(luò)應(yīng)用中,代理服務(wù)器是用于中轉(zhuǎn)用戶請(qǐng)求和服務(wù)端響應(yīng)的工具,正向代理主要用于客戶端與外部服務(wù)器之間的訪問(wèn)代理,幫助客戶端隱藏其 IP 地址或訪問(wèn)受限資源,本文將詳細(xì)介紹如何使用 Nginx 搭建正向代理服務(wù)器,特別是針對(duì) HTTPS 網(wǎng)站的代理
    2024-11-11
  • 使用Nginx為自己的網(wǎng)站資源加上防盜鏈保護(hù)實(shí)現(xiàn)

    使用Nginx為自己的網(wǎng)站資源加上防盜鏈保護(hù)實(shí)現(xiàn)

    這篇文章主要為大家介紹了使用Nginx為自己的網(wǎng)站資源加上防盜鏈保護(hù)實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Nginx常見的錯(cuò)誤配置舉例

    Nginx常見的錯(cuò)誤配置舉例

    這篇文章主要介紹了Nginx常見的錯(cuò)誤配置舉例,幫助大家更好的理解和學(xué)習(xí)使用Nginx,感興趣的朋友可以了解下
    2021-03-03
  • 詳解nginx中的日志配置

    詳解nginx中的日志配置

    日志對(duì)于統(tǒng)計(jì)排錯(cuò)來(lái)說(shuō)非常有利的,本文為大家總結(jié)了nginx日志相關(guān)的配置如access_log、log_format、open_log_file_cache等內(nèi)容,感興趣的小伙伴可以了解下
    2023-08-08
  • 阿里云Nginx配置https實(shí)現(xiàn)域名訪問(wèn)項(xiàng)目(圖文教程)

    阿里云Nginx配置https實(shí)現(xiàn)域名訪問(wèn)項(xiàng)目(圖文教程)

    這篇文章主要介紹了阿里云Nginx配置https實(shí)現(xiàn)域名訪問(wèn)項(xiàng)目(圖文教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 在CentOS?7上使用Nginx將www重定向到非www的完整步驟

    在CentOS?7上使用Nginx將www重定向到非www的完整步驟

    本文介紹了如何在CentOS7上使用Nginx進(jìn)行域名重定向配置,以及設(shè)置相應(yīng)的DNS記錄,重定向不僅有助于提高網(wǎng)站的搜索引擎排名,還能確保用戶無(wú)論通過(guò)www還是非www域名訪問(wèn),都能獲得一致的網(wǎng)站體驗(yàn),需要的朋友可以參考下
    2024-11-11
  • nginx的keepalive相關(guān)參數(shù)使用源碼解讀

    nginx的keepalive相關(guān)參數(shù)使用源碼解讀

    這篇文章主要為大家介紹了nginx的keepalive相關(guān)參數(shù)使用源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 修改配置解決Nginx服務(wù)器中常見的上傳與連接錯(cuò)誤

    修改配置解決Nginx服務(wù)器中常見的上傳與連接錯(cuò)誤

    這篇文章主要介紹了修改配置解決Nginx服務(wù)器中常見的上傳與連接錯(cuò)誤的方法,分別針對(duì)Nginx的413錯(cuò)誤與111錯(cuò)誤,需要的朋友可以參考下
    2016-01-01
  • Nginx HTTP 配置指令的實(shí)現(xiàn)示例

    Nginx HTTP 配置指令的實(shí)現(xiàn)示例

    本文主要介紹了Nginx的配置文件結(jié)構(gòu)和HTTP配置指令,涵蓋了從請(qǐng)求處理到安全、日志、負(fù)載均衡、緩存等各個(gè)方面,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • Nginx正向代理實(shí)現(xiàn)局域網(wǎng)電腦訪問(wèn)外網(wǎng)的過(guò)程詳解

    Nginx正向代理實(shí)現(xiàn)局域網(wǎng)電腦訪問(wèn)外網(wǎng)的過(guò)程詳解

    在工作中我遇到了一個(gè)類似的情況:在公司網(wǎng)絡(luò)中,由于管理要求,局域網(wǎng)內(nèi)的電腦不能直接訪問(wèn)外網(wǎng),但是,工作上領(lǐng)導(dǎo)吩咐需要讓局域網(wǎng)內(nèi)的電腦能夠訪問(wèn)外網(wǎng)上的某個(gè)網(wǎng)站,這時(shí)候就需要用到正向代理,本文將介紹如何配置 Nginx 實(shí)現(xiàn)這一功能,需要的朋友可以參考下
    2024-03-03

最新評(píng)論