nginx(一):跨域問題

  • 爲什麼會發生AJAX跨域?


瀏覽器限制

跨域

XHR(XMLHttpRequest)請求

同時滿足以上三個條件的時候纔會出現跨域問題

 

  • 解決方案:

被調用方解決方案(支持跨域):

前端代碼寫法(假設:a.com 調用方,b.com被調用方)如下,直接在代碼中寫明被調用方的具體地址

$.getJSON("http://b.com/test/get1").then(function(jsonObj) {
        result = jsonObj;
});

1. 瀏覽器直接發送請求到其他域的應用服務器

瀏覽器在請求頭中添加Origin參數記錄host,應用服務器通過實現filter,在響應頭中設置Access-Control-Allow-Origin參數爲host,從而通過瀏覽器的檢驗,達到跨域的目的

 

 

帶Cookie的跨域

1. Access-Control-Allow-Origin:*?  這個參數的值不可以爲*,需要是具體調用方的host,可以通過動態讀取請求頭的Origin參數設置該參數的值。

2. 發送的cookie是被調用方域名的cookie,而不是調用方的cookie

 

2. 瀏覽器將請求發送到其他域系統的http服務器(如:apache,nginx),然後http服務器再將請求發送到應用服務器。(在http服務器中配置請求頭)

nginx配置如下:

 

調用方解決方案(隱藏跨域):

nginx配置:
server {
    listen       80;
    server_name  a.com;

    location / {
        proxy_pass http://localhost:8081/ ;
    }
    
    location /panda {
        proxy_pass http://localhost:8080/test ;
    }
}
前端代碼:
$.getJSON("/panda/get1").then(function(jsonObj) {
                   result = jsonObj;
               });

注意:這裏url用的相對地址 就是訪問 a.com/panda ,然後nginx的設置會使其反向代理到http://localhost:8080/test

實際上是a.com訪問http://localhost:8080/test,但是 瀏覽器看起來是a.com訪問a.com/panda根本沒跨域! 當然麼有跨域問題!

通過nginx解決跨域問題,兩種方案的區別是:這個nginx是安裝在調用方還是被調用方,安裝在調用方,那麼前端只需要寫出相對地址url,安裝在被調用方,那麼前端需要寫出被調用方的絕對路徑

 

http {
    upstream upstream_name{
        server 192.168.0.28:8001;
        server 192.168.0.28:8002;
    }

    server {
        listen       8080;
        server_name  localhost;

        location / {
            proxy_pass http://upstream_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章