通過nginx反向代理實現跨域訪問


通過nginx反向代理實現跨域訪問

同源策略

  • 同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能
  • 同源 指的是 域名、協議、端口都相同。如果其中有一個不同,瀏覽器會認為不同源,也就是跨域

跨域訪問實現過程

  • 寫一段最簡單的請求后台的代碼,將后台返回結果在控制台輸出,此時,瀏覽器請求地址和代碼里請求后台的url地址是同源的,頁面沒有報錯,后台返回的結果輸出到控制台里:
通過nginx反向代理實現跨域訪問

前端html代碼

通過nginx反向代理實現跨域訪問

請求結果

  • 然后,我換個請求后台的url地址,將a.tankhui.cn 換成 b.tankhui.cn 但在nginx中實際他們指向的訪問目錄是一樣的。此時,瀏覽器請求地址a.tankhui.cn和代碼里請求后台的url地址 b.tankhui.cn 不同源,所以,頁面出現了跨域報錯 。
通過nginx反向代理實現跨域訪問

將a.tankhui.cn 換成 b.tankhui.cn

通過nginx反向代理實現跨域訪問

出現跨域報錯

  • 下面是此時的后台 ngixn配置:
通過nginx反向代理實現跨域訪問

nginx配置

  • 現在為了可以訪問 b.tankhui.cn 的內容,又要解決跨域的問題,我在前端代碼中還是請求 a.tankhui.cn ,然后,在nginx配置中,將來自 a.tankhui.cn 的后端請求代理到 b.tankhui.cn,此時可以正常訪問 b.tankhui.cn的內容
通過nginx反向代理實現跨域訪問

請求代理到 b.tankhui.cn

通過nginx反向代理實現跨域訪問

來自 b.tankhui.cn的請求結果

  • 為了證實請求確實被轉發到 b.tankhui.cn,我在nginx配置中,將訪問日志記錄到特定的文件下:
通過nginx反向代理實現跨域訪問

設置 b.tankhui.cn的訪問日志,注意server_name 是 b.tankhui.cn

  • 當我訪問 http://a.tankhui.cn/index.html 時,能看到 b.tankhui.cn 網站的訪問日志確實有記錄:
通過nginx反向代理實現跨域訪問

b.tankhui.cn nginx 日志記錄

  • 此時,已經實現了跨域的訪問。然而,上面是將所有來自 a.tankhui.cn 的后台請求,都轉發到了 b.tankhui.cn, 這種方式比較粗暴,實際工作中,只有一部分請求,需要代理到其他網站。
  • 下面,為了標識需要代理到b.tankhui.cn 的請求,請求后台的 url地址 后面加一個flag=1的參數:
通過nginx反向代理實現跨域訪問

請求參數加了 flag=1

  • 相應地,在后台nginx配置中,給 flag先賦一個初始值 0,只有當請求參數中帶有 flag=1的,將flag的值變為1,認為需要代理到 b.tankhui.cn。
通過nginx反向代理實現跨域訪問

根據 flag的值判斷是否需要代理到 b.tankhui.cn

  • 現在我改變不同的請求后台的url地址,發現,只有 帶有flag=1的請求,才會被代理到b.tankhui.cn, 並能在b.tankhui.cn 的nginx訪問日志中看到。
通過nginx反向代理實現跨域訪問

改變 url的值,請求文件和flag不同

通過nginx反向代理實現跨域訪問

url='http://a.tankhui.cn/newTest.php?flag=1'

通過nginx反向代理實現跨域訪問

url = 'http://a.tankhui.cn/test.php'

通過nginx反向代理實現跨域訪問

b.tankhui.cn nginx日志

  • 這樣就可以將特定的請求代理到其他網站,實現跨域訪問。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM