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

1.定義

跨域是指a頁面想獲取b頁面資源,若是a、b頁面的協議、域名、端口、子域名不一樣,所進行的訪問行動都是跨域的,而瀏覽器爲了安全問題通常都限制了跨域訪問,也就是不容許跨域請求資源。注意:跨域限制訪問,實際上是瀏覽器的限制。理解這一點很重要!!!javascript

2.跨域訪問示例

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

如今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);
            })
        })

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

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

3.1nginx配置

關於nginx的配置能夠查看另外一篇博文:http://www.cnblogs.com/renjing/p/6126284.html。找到nginx的配置文件「nginx.conf」,修改一下信息java

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;
       }
#如下配置省略

配置解釋:jquery

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

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

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

表明重寫攔截進來的請求,而且只能對域名後邊以「/apis」開頭的起做用,例如www.a.com/apis/msg?x=1重寫。只對/apis重寫。json

  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纔是正規的解決方案

相關文章
相關標籤/搜索