跨域是指a頁面想獲取b頁面資源,若是a、b頁面的協議、域名、端口、子域名不一樣,所進行的訪問行動都是跨域的,而瀏覽器爲了安全問題通常都限制了跨域訪問,也就是不容許跨域請求資源。注意:跨域限制訪問,實際上是瀏覽器的限制。理解這一點很重要!!!javascript
假設有兩個網站,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
關於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表明匹配一個以後中止匹配。
既然配置了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>
瀏覽器跨域的解決方式有不少種:
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纔是正規的解決方案