nginx反向代理-解決前端跨域問題

来源:http://www.cnblogs.com/renjing/archive/2017/02/13/6394725.html
-Advertisement-
Play Games

1.定義 跨域是指a頁面想獲取b頁面資源,如果a、b頁面的協議、功能變數名稱、埠、子功能變數名稱不同,所進行的訪問行動都是跨域的,而瀏覽器為了安全問題一般都限制了跨域訪問,也就是不允許跨域請求資源。註意:跨域限制訪問,其實是瀏覽器的限制。理解這一點很重要!!! 2.跨域訪問示例 假設有兩個網站,A網站部署在:ht ...


1.定義

跨域是指a頁面想獲取b頁面資源,如果a、b頁面的協議、功能變數名稱、埠、子功能變數名稱不同,所進行的訪問行動都是跨域的,而瀏覽器為了安全問題一般都限制了跨域訪問,也就是不允許跨域請求資源。註意:跨域限制訪問,其實是瀏覽器的限制。理解這一點很重要!!!

2.跨域訪問示例

假設有兩個網站,A網站部署在:http://localhost:81 即本地ip埠81上;B網站部署在:http://localhost:82 即本地ip埠82上。

現在A網站的頁面想去訪問B網站的信息,A網站頁面的代碼如下(這裡使用jquery的非同步請求):

<h2>Index</h2>
<div id="show"></div>
<script type="text/javascript">
        $(function () {
            $.get("http://localhost:82/api/values", {}, function (result) {
                $("#show").html(result);
            })
        })

這是瀏覽器會提示如下錯誤信息:

3.nginx反向代理解決跨域問題

3.1nginx配置

關於nginx的配置可以查看另一篇博文:http://www.cnblogs.com/renjing/p/6126284.html。找到nginx的配置文件“nginx.conf”,修改一下信息

server {
        listen       80; #監聽80埠,可以改成其他埠
        server_name  localhost; # 當前服務的功能變數名稱

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://localhost:81;
            proxy_redirect default;
        }

		location /apis { #添加訪問目錄為/apis的代理配置
			rewrite  ^/apis/(.*)$ /$1 break;
			proxy_pass   http://localhost:82;
       }
#以下配置省略

配置解釋:

1.由配置信息可知,我們讓nginx監聽localhost的80埠,網站A與網站B的訪問都是經過localhost的80埠進行訪問。

2.我們特殊配置了一個“/apis”目錄的訪問,並且對url執行了重寫,最後使以“/apis”開頭的地址都轉到“http://localhost:82”進行處理。

3.rewrite  ^/apis/(.*)$ /$1 break; 

代表重寫攔截進來的請求,並且只能對功能變數名稱後邊以“/apis”開頭的起作用,例如www.a.com/apis/msg?x=1重寫。只對/apis重寫。

  rewrite後面的參數是一個簡單的正則 ^/apis/(.*)$ ,$1代表正則中的第一個(),$2代表第二個()的值,以此類推。

  break代表匹配一個之後停止匹配。

3.2 訪問地址修改

既然配置了nginx,那麼所有的訪問都要走nginx,而不是走網站原本的地址(A網站localhost:81,B網站localhost:82)。所以要修改A網站中的ajax訪問地址,把訪問地址由

“http://localhost:82/api/values”改成》》》“/apis/api/values”。如下代碼:

<h2>Index</h2>
<div id="show"></div>

<script type="text/javascript">
        $(function () {
            $.get("/apis/api/values", {}, function (result) {
                $("#show").html(result);
            })
        })
</script>
View Code

 4.網站的訪問

5.總結

瀏覽器跨域的解決方式有很多種:

1.jsonp 需要目標伺服器配合一個callback函數。

  2.window.name+iframe 需要目標伺服器響應window.name。

  3.window.location.hash+iframe 同樣需要目標伺服器作處理。

  4.html5的 postMessage+ifrme 這個也是需要目標伺服器或者說是目標頁面寫一個postMessage,主要側重於前端通訊。

  5.CORS  需要伺服器設置header :Access-Control-Allow-Origin。

  6.nginx反向代理 這個方法一般很少有人提及,但是他可以不用目標伺服器配合,不過需要你搭建一個中轉nginx伺服器,用於轉發請求。

個人覺得6才是正規的解決方案

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.騰訊優圖 1.開發者地址:http://open.youtu.qq.com/welcome/developer 2.接入流程:按照開發者頁面的接入流程接入之後,創建應用即可獲得所需的AppID、SecretID和SecretKey這是進行介面調用必須的憑證 3.測試流程: 3.1.測試可以直接調 ...
  • 這裡並未涉及到JSR181Annotations的相關應用,具體的三種方式如下 ①通過WSDL地址來創建動態客戶端②通過服務端提供的介面來創建客戶端③使用Ant通過WSDL文件來生成客戶端 第一種方式:通過WSDL地址來創建動態客戶端 view plainprint? ...
  • 列印thinkphp中的sql語句 var_dump($repair->fetchSql(true)->where(array('cuername' =>$cuername))->order('applytime desc')->limit($page1*$listRows,$listRows)-> ...
  • 歡迎大家來咨詢海南七星彩打獎系統,系統可以支持手機下註的南方海南,湛江七星彩投註網站系統,也可以出租,出售等渠道,或者定製,可以選擇支持手機下註或者不支持,需要定製的,可以私信,扣扣:1930-1335-70 本截圖只作為演示,如有需要定製,購買,請聯繫客服購買正版授權使用。 會員演示圖: 代理演示 ...
  • 1 import java.util.*; 2 class CalendarTest 3 { 4 /*先輸出提示語句,並接受用戶輸入的年、月。 5 根據用戶輸入的年,先判斷是否是閏年。 6 根據用戶輸入的年份來判斷月的天數。 7 用迴圈計算用戶輸入的年份距1900年1月1日的總天數。 8 用迴圈計算... ...
  • mybatis和hibernate之間的對比。及應用場景的介紹 ...
  • sso單點登錄系統的最全的搭建方法,只要你按我的步驟來,就可以成功的搭建出你的sso單點登錄系統。 ...
  • 定義 觀察者模式(有時又被稱為發佈(publish)-訂閱(Subscribe)模式,在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統(摘自百度百科)。 關鍵詞:發佈-訂閱 為什 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...