<abbr id="q8sqa"><strong id="q8sqa"></strong></abbr>
  • <fieldset id="q8sqa"><samp id="q8sqa"></samp></fieldset>
    <option id="q8sqa"><strong id="q8sqa"></strong></option>
  • \n    

    請求轉(zhuǎn)發(fā)測試<\/h1>\n    <\/p>\n    

    亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

    目錄
    什麼是跨域
    為什麼會跨域
    如何解決跨域
    1.代理伺服器
    1.線上環(huán)境
    2.開發(fā)環(huán)境
    1.借助JSONP
    2.使用CORS
    3.其他方案
    總結(jié)
    首頁 運(yùn)維 Nginx 如何解決跨域?常見解決方案淺析

    如何解決跨域?常見解決方案淺析

    Apr 25, 2023 pm 07:57 PM
    前端 面試 nginx

    如何解決跨域?常見解決方案淺析

    跨領(lǐng)域是開發(fā)中常會遇到的場景,也是面試中常會討論的問題。掌握常見的跨域解決方案及其背後的原理,不僅可以提高我們的開發(fā)效率,還能在面試中表現(xiàn)的更加游刃有餘。

    因此今天就來跟大家從前端的角度來聊聊解決跨域常見的幾種方式。

    什麼是跨域

    在講跨域之前,我們先來看看URL的組成內(nèi)容:

    一個URL的組成,通常包含協(xié)定、主機(jī)名稱、連接埠號碼、路徑、查詢參數(shù)和錨點(diǎn)幾個部分。

    這裡展示了一個URL的範(fàn)例:

    https://www.example.com:8080/path/resource.html?page=1&sort=desc#header

    在上述範(fàn)例中:
    ● 協(xié)定為HTTPS
    ● 主機(jī)名為www.example.com
    ● 端口編號為8080
    ● 路徑為/path/resource.html
    ● 查詢參數(shù)為page=1&sort=desc
    ● 錨點(diǎn)為header

    ##所謂跨域,指的是請求URL中協(xié)定、主機(jī)名稱、連接埠號碼中任一個部分不相同。

    以上述URL為例,以下幾種寫法都算是和它跨域:

    http://www.example.com:8080/    // 協(xié)議不同
    https://www.example.a.com:8080/ // 主機(jī)名不同
    https://www.example.com:8081/   // 端口號不同

    為什麼會跨域

    其實(shí)

    跨域問題的出現(xiàn)??是受限於瀏覽器的同源策略

    所謂的同源策略,其實(shí)是瀏覽器的安全機(jī)制,用來限制一個網(wǎng)頁中網(wǎng)路請求僅能夠存取來自相同來源(網(wǎng)域名稱、協(xié)定和連接埠號碼皆相同)的資源,主要目的是防止惡意網(wǎng)站透過腳本竊取其他網(wǎng)站的敏感數(shù)據(jù),保障使用者的隱私和安全。

    當(dāng)瀏覽器端的腳本(js檔案)存取了其他網(wǎng)域的網(wǎng)路資源時,就會出現(xiàn)跨網(wǎng)域問題。

    如何解決跨域

    前文說到,跨域問題的出現(xiàn)??是受限於瀏覽器的同源策略,那麼常見的解決跨域問題的方案,其實(shí)也是圍繞著瀏覽器展開的:

    1.代理伺服器

    在我們平常的開發(fā)中,

    解決跨域問題最常使用的方案是使用代理伺服器。

    代理伺服器解決跨網(wǎng)域問題其實(shí)是抓住了同源策略只受限於瀏覽器存取伺服器,對於伺服器存取伺服器並沒有限制的特點(diǎn),作為中間伺服器做了一個請求轉(zhuǎn)送的功能

    具體來說,就是前端工程師編寫的網(wǎng)頁運(yùn)行在由webpack等腳手架搭建的代理伺服器上,當(dāng)前端網(wǎng)頁在瀏覽器中發(fā)起網(wǎng)絡(luò)請求時,其實(shí)這個請求是發(fā)送到代理伺服器上的,然後代理伺服器會將請求轉(zhuǎn)送給目標(biāo)伺服器,再將目標(biāo)伺服器回傳的回應(yīng)轉(zhuǎn)送給客戶端。

    代理伺服器在過程中扮演了一個中轉(zhuǎn)的角色,可以對請求和回應(yīng)進(jìn)行一些修改、過濾和攔截,以實(shí)現(xiàn)一些特定的功能。

    因?yàn)榍岸司W(wǎng)頁運(yùn)行在代理伺服器上,所以不存在跨域問題。

    那麼在線上環(huán)境和開發(fā)環(huán)境下,代理伺服器是如何做請求轉(zhuǎn)送的呢?

    1.線上環(huán)境
    在線上環(huán)境下,我們一般會採用

    nginx來做反向代理,從而把前端的請求轉(zhuǎn)送到目標(biāo)接口上。

    nginx是一個輕量級高並發(fā)的web伺服器,基於事件驅(qū)動,而且跨平臺,window和Linux都可以進(jìn)行設(shè)定。

    它作為代理伺服器來解決開發(fā)中的跨域問題的主要方法就是監(jiān)聽線上前端網(wǎng)址的運(yùn)行端口,然後碰到包含特殊標(biāo)記的請求後就進(jìn)行請求轉(zhuǎn)發(fā) 。

    2.開發(fā)環(huán)境
    在開發(fā)環(huán)境下,無論是藉助於webpack還是使用vite或其他腳手架搭建的前端項(xiàng)目,解決跨域問題的核心是借助

    http-proxy-middleware中間件實(shí)現(xiàn)的。而http-proxy-middleware中介軟體的核心又是對http-proxy的進(jìn)一步封裝。

    這裡先展示一下在專案中使用

    http-proxy-middleware來實(shí)作請求轉(zhuǎn)送功能的範(fàn)例程式碼:

    const { createProxyMiddleware } = require(&#39;http-proxy-middleware&#39;);
    
    module.exports = {
      server: {
        proxy: {
          // 將 /api/* 的請求代理到 http://localhost:3000/*
          &#39;/api&#39;: {
            target: &#39;http://localhost:3000&#39;,
            changeOrigin: true,
            pathRewrite: { &#39;^/api&#39;: &#39;/&#39; }
          }
        }
      }
    };

    接著

    我們可以自己使用原生node,借助http-proxy庫來建立一個具有請求轉(zhuǎn)發(fā)功能的代理伺服器Demo,有興趣的朋友可以自己測試玩玩

    1. 首先需要建立一個空資料夾(全英命名)作為專案資料夾,然後使用npm init -y指令將專案升級為node的專案:

    npm init -y

    2. 接著在專案根目錄下建立一個index.html檔案用於發(fā)起跨域請求:

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="UTF-8">
        <title>請求轉(zhuǎn)發(fā)測試</title>
    </head>
    
    <body>
        <h1>請求轉(zhuǎn)發(fā)測試</h1>
        <p id="message"></p>
        <script>
            fetch(&#39;/api/login&#39;)
                .then(response => response.text())
                .then(data => {
                    document.getElementById(&#39;message&#39;).textContent = data;
                });
        </script>
    </body>
    
    </html>

    3. 接著在專案根目錄下新建index .js檔案來寫服務(wù)端的程式碼。
    index.js檔案是實(shí)作具有請求轉(zhuǎn)送功能的代理伺服器的核心檔案。

    const http = require(&#39;http&#39;);
    const httpProxy = require(&#39;http-proxy&#39;);
    const fs = require(&#39;fs&#39;);
    const path = require(&#39;path&#39;);
    
    // 創(chuàng)建代理服務(wù)器實(shí)例
    const proxy = httpProxy.createProxyServer({});
    
    // 創(chuàng)建HTTP服務(wù)器
    const server = http.createServer((req, res) => {
        if (req.url === &#39;/&#39; || req.url.endsWith(&#39;.html&#39;)) {
            // 讀取HTML文件
            const filename = path.join(__dirname, &#39;index.html&#39;);
            fs.readFile(filename, &#39;utf8&#39;, (err, data) => {
                if (err) {
                    res.writeHead(500);
                    res.end(&#39;Error reading HTML file&#39;);
                } else {
                    res.writeHead(200, { &#39;Content-Type&#39;: &#39;text/html&#39; });
                    res.end(data);
                }
            });
        } else if (req.url.startsWith(&#39;/api&#39;)) {
            // 重寫路徑,替換跨域關(guān)鍵詞
            req.url = req.url.replace(/^\/api/, &#39;&#39;);
            // 將請求轉(zhuǎn)發(fā)至目標(biāo)服務(wù)器
            proxy.web(req, res, {
                target: &#39;http://localhost:3000/&#39;,
                changeOrigin: true,
            });    
        }
    });
    
    // 監(jiān)聽端口
    server.listen(8080, () => {
        console.log(&#39;Server started on port 8080&#39;);
    });

    4. 接著編寫目標(biāo)伺服器target.js檔案的內(nèi)容,用於測試跨網(wǎng)域存?。?/strong>

    const http = require(&#39;http&#39;);
    
    const server = http.createServer((req, res) => {
        if (req.url.startsWith(&#39;/login&#39;)) {
            res.writeHead(200, { &#39;Content-Type&#39;: &#39;text/plain&#39; });
            res.end(&#39;我是localhost主機(jī)3000端口下的方法,恭喜你訪問成功!&#39;);
        } else {
            res.writeHead(200, { &#39;Content-Type&#39;: &#39;text/plain&#39; });
            res.end(&#39;Hello, world!&#39;);
        }
    });
    
    server.listen(3000, () => {
        console.log(&#39;Target server is listening on port:3000&#39;);
    })

    5. 打開終端,輸入啟動目標(biāo)服務(wù)器的命令:

    node ./target.js //項(xiàng)目根目錄下執(zhí)行

    6. 再開一個終端啟動代理服務(wù)器,等待瀏覽器端發(fā)起請求就可以啦:

    node ./index.js //項(xiàng)目根目錄下執(zhí)行

    7. 最后在瀏覽器里訪問http://localhost:8080, 打開控制臺即可查看效果:

    可以發(fā)現(xiàn),瀏覽器network模塊的網(wǎng)絡(luò)請求確實(shí)是訪問的8080端口的方法,但是我們的服務(wù)器默默的做了請求轉(zhuǎn)發(fā)的功能,并將請求轉(zhuǎn)發(fā)獲取到的內(nèi)容返回到了前端頁面上。

    其實(shí)http-proxy是對node內(nèi)置庫http的進(jìn)一步封裝,網(wǎng)絡(luò)請求的核心部分還是使用http創(chuàng)建一個服務(wù)器對象去訪問的。感興趣的同學(xué)可以再讀讀http-proxy的源碼~

    除了代理服務(wù)器這種繞過瀏覽器同源策略的解決方式外,從前端的角度解決跨域問題還有如下一些常見的方法:

    1.借助JSONP

    JSONP的原理是通過動態(tài)創(chuàng)建

    熱AI工具

    Undress AI Tool

    Undress AI Tool

    免費(fèi)脫衣圖片

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費(fèi)的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強(qiáng)大的PHP整合開發(fā)環(huán)境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網(wǎng)頁開發(fā)工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    Laravel 教程
    1597
    29
    PHP教程
    1488
    72
    php寫完代碼怎麼執(zhí)行 php代碼執(zhí)行的幾種常見方式 php寫完代碼怎麼執(zhí)行 php代碼執(zhí)行的幾種常見方式 May 23, 2025 pm 08:33 PM

    PHP代碼可以通過多種方式執(zhí)行:1.使用命令行,直接輸入“php文件名”執(zhí)行腳本;2.通過Web服務(wù)器,將文件放入文檔根目錄並通過瀏覽器訪問;3.在IDE中運(yùn)行,利用內(nèi)置調(diào)試工具;4.使用在線PHP沙箱或代碼執(zhí)行平臺進(jìn)行測試。

    安裝Nginx後配置文件路徑及初始設(shè)置 安裝Nginx後配置文件路徑及初始設(shè)置 May 16, 2025 pm 10:54 PM

    了解Nginx的配置文件路徑和初始設(shè)置非常重要,因?yàn)樗莾?yōu)化和管理Web服務(wù)器的第一步。 1)配置文件路徑通常是/etc/nginx/nginx.conf,使用nginx-t命令可以查找並測試語法。 2)初始設(shè)置包括全局設(shè)置(如user、worker_processes)和HTTP設(shè)置(如include、log_format),這些設(shè)置允許根據(jù)需求進(jìn)行定制和擴(kuò)展,錯誤配置可能導(dǎo)致性能問題和安全漏洞。

    linux如何限制用戶資源? ulimit怎麼配置? linux如何限制用戶資源? ulimit怎麼配置? May 29, 2025 pm 11:09 PM

    Linux系統(tǒng)通過ulimit命令限制用戶資源,防止資源過度佔(zhàn)用。 1.ulimit是shell內(nèi)置命令,可限製文件描述符數(shù)(-n)、內(nèi)存大?。?v)、線程數(shù)(-u)等,分為軟限制(當(dāng)前生效值)和硬限制(最高上限)。 2.臨時修改直接使用ulimit命令,如ulimit-n2048,但僅對當(dāng)前會話有效。 3.永久生效需修改/etc/security/limits.conf及PAM配置文件,並添加sessionrequiredpam_limits.so。 4.systemd服務(wù)需在unit文件中設(shè)置Lim

    Debian Nginx配置技巧有哪些 Debian Nginx配置技巧有哪些 May 29, 2025 pm 11:06 PM

    在Debian系統(tǒng)上配置Nginx時,以下是一些實(shí)用的技巧:配置文件的基本結(jié)構(gòu)全局設(shè)置部分:定義影響整個Nginx服務(wù)的行為參數(shù),比如工作線程數(shù)量及運(yùn)行用戶權(quán)限。事件處理部分:決定Nginx如何應(yīng)對網(wǎng)絡(luò)連接,是提升性能的關(guān)鍵配置。 HTTP服務(wù)部分:包含大量與HTTP服務(wù)相關(guān)的設(shè)定,可內(nèi)嵌多個server和location塊。核心配置選項(xiàng)worker_connections:定義每個工作線程所能處理的最大連接數(shù),通常設(shè)為1024。 multi_accept:激活多連接接收模式,增強(qiáng)並發(fā)處理的能力。 s

    Debian Apache2的SEO優(yōu)化技巧有哪些 Debian Apache2的SEO優(yōu)化技巧有哪些 May 28, 2025 pm 05:03 PM

    DebianApache2的SEO優(yōu)化技巧涵蓋多個層面,以下是一些關(guān)鍵方法:關(guān)鍵詞研究:利用工具(如關(guān)鍵詞魔術(shù)工具)挖掘頁面的核心及輔助關(guān)鍵詞。優(yōu)質(zhì)內(nèi)容創(chuàng)作:產(chǎn)出有價值且原創(chuàng)的內(nèi)容,內(nèi)容需經(jīng)過深入調(diào)研,確保語言流暢且格式清晰。內(nèi)容排版與結(jié)構(gòu)優(yōu)化:運(yùn)用標(biāo)題和小標(biāo)題引導(dǎo)閱讀。編寫簡潔明了的段落和句子。利用列表展示重點(diǎn)信息。結(jié)合圖片、視頻等多媒體增強(qiáng)表現(xiàn)力。留白設(shè)計提昇文本易讀性。技術(shù)層面SEO改進(jìn):robots.txt文件:規(guī)定搜索引擎爬蟲的訪問權(quán)限。加速網(wǎng)頁加載:借助緩存機(jī)制和Apache配置優(yōu)化

    如何在Debian上實(shí)現(xiàn)Docker的自動化部署 如何在Debian上實(shí)現(xiàn)Docker的自動化部署 May 28, 2025 pm 04:33 PM

    在Debian系統(tǒng)上實(shí)現(xiàn)Docker的自動化部署可以通過多樣的方法來完成,以下是詳細(xì)的步驟指南:1.安裝Docker首先,確保你的Debian系統(tǒng)保持最新狀態(tài):sudoaptupdatesudoaptupgrade-y接著,安裝必要的軟件包以支持APT通過HTTPS訪問倉庫:sudoaptinstallapt-transport-httpsca-certificatescurlsoftware-properties-common-y導(dǎo)入Docker的官方GPG密鑰:curl-

    配置PhpStorm與Docker容器化開發(fā)環(huán)境 配置PhpStorm與Docker容器化開發(fā)環(huán)境 May 20, 2025 pm 07:54 PM

    通過Docker容器化技術(shù),PHP開發(fā)者可以利用PhpStorm提高開發(fā)效率和環(huán)境一致性。具體步驟包括:1.創(chuàng)建Dockerfile定義PHP環(huán)境;2.在PhpStorm中配置Docker連接;3.創(chuàng)建DockerCompose文件定義服務(wù);4.配置遠(yuǎn)程PHP解釋器。優(yōu)點(diǎn)是環(huán)境一致性強(qiáng),缺點(diǎn)包括啟動時間長和調(diào)試複雜。

    配置Nginx服務(wù)開機(jī)自啟動的具體步驟 配置Nginx服務(wù)開機(jī)自啟動的具體步驟 May 16, 2025 pm 10:39 PM

    Nginx配置開機(jī)自啟動的步驟如下:1.創(chuàng)建systemd服務(wù)文件:sudonano/etc/systemd/system/nginx.service,並添加相關(guān)配置。 2.重新加載systemd配置:sudosystemctldaemon-reload。 3.啟用Nginx開機(jī)自啟動:sudosystemctlenablenginx。通過這些步驟,Nginx會在系統(tǒng)啟動時自動運(yùn)行,確保網(wǎng)站或應(yīng)用的可靠性和用戶體驗(yàn)。

    See all articles