三分鐘解決先後端分離項目中的跨域問題

想看重點的直接挪到文章底部,nginx反向代理的配置javascript

跨域

涉及到先後端開發的項目中,不可避免的涉及到了跨域的問題。跨域,指的是瀏覽器不能執行其餘網站的腳本。php

瀏覽器的同源策略會致使跨域,這裏同源策略又分爲如下兩種
DOM同源策略:禁止對不一樣源頁面DOM進行操做。這裏主要場景是iframe跨域的狀況,不一樣域名的iframe是限制互相訪問的。
XmlHttpRequest同源策略:禁止使用XHR對象向不一樣源的服務器地址發起HTTP請求。
只要協議、域名、端口有任何一個不一樣,都被看成是不一樣的域,之間的請求就是跨域操做。

所謂同源是指,域名,協議,端口均相同,不明白不要緊,舉個栗子:
http://www.123.com/test.html 調用 http://www.123.com/test.php (非跨域)
http://www.123.com/test.html 調用 http://www.456.com/test.php (主域名不    同:123/456,跨域)
http://abc.123.com/test.html 調用 http://def.123.com/test.php (子域名不一樣:abc/def,跨域)
http://www.123.com:8080/test.html 調用 http://www.123.com:8081/test.php (端口不一樣:8080/8081,跨域)
http://www.123.com/test.html 調用 https://www.123.com/test.php (協議不一樣:http/https,跨域)
請注意:localhost和127.0.0.1雖然都指向本機,但也屬於跨域。
瀏覽器執行javascript腳本時,會檢查這個腳本屬於哪一個頁面,若是不是同源頁面,就不會被執行。

解決跨域的辦法

1.jsonphtml

使用方式就不贅述了,基本原理就是經過動態建立script標籤,而後利用src屬性進行跨域,可是要注意JSONP只支持GET請求,不支持POST請求。

2.CORS(跨域資源共享)java

利用nginx或者php、java等後端語言設置容許跨域請求
header('Access-Control-Allow-Origin:*');//容許全部來源訪問
header('Access-Control-Allow-Method:POST,GET');//容許訪問的方式
今天不做重點介紹

3.服務器代理node

瀏覽器有跨域限制,可是服務器不存在跨域問題,因此能夠由服務器請求所要域的資源再返回給客戶端。

4.其餘nginx

利用Nginx反向代理解決跨域問題

今天介紹的重點,直接上代碼json

這是本地的開發環境nginx的配置
http {
    client_max_body_size 1024m;
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    server {
        listen       8081; #自身監聽8081端口
        server_name first;
        location /apis/xos {
            #當匹配到/apis/xos 地址是時訪問 http://172.99.99.99:31004/
            proxy_pass http://172.99.99.99:31004/;
        }
        location /apis/rds {
            #當匹配到/apis/rds 地址是時訪問 http://172.88.88.88:20152
            proxy_pass  http://172.88.88.88:20152/;
        }        
        location /apis {
            #當匹配到/apis 地址是時訪問  http://172.88.88.88:31002/,一個api地址
            proxy_pass http://172.88.88.88:31002/; 
        }
        location / {
            proxy_pass http://127.0.0.1:8080; #匹配不到其餘地址默認匹配的地址是訪問 8080端口,本地node start啓動的服務
        }
    }
}

服務端的配置大致同樣後端

server {
    listen       80;
    server_name  localhost;

    location / {
        root   html;
        #HTML5 History 模式 nginx的配置
        try_files $uri $uri/ /index.html;
    }
    location /apis/xos {
            proxy_pass http://172.88.88.88:31004/;
        }
    location /apis/rds {
            proxy_pass http://172.99.99.99:20152/;
    }
    location /apis/ {
        proxy_pass   http://172.77.77.77:31002/;
    }
    location /index.html {
        #不容許緩存
        add_header Cache-Control " no-store";
    }
}
相關文章
相關標籤/搜索