40.Nginx的反向代理功能解決跨域問(wèn)題

1.什么情況下是跨域?

跨域是指a頁(yè)面想獲取b頁(yè)面資源,如果a、b頁(yè)面的協(xié)議、域名、端口、子域名不同,或是a頁(yè)面為ip地址,b頁(yè)面為域名地址,所進(jìn)行的訪問(wèn)行動(dòng)都是跨域的。(如下圖都是跨域訪問(wèn))

Uri 說(shuō)明 是否跨域
http://www.cnblogs.com/a.js
http://www.a.com/b.js 不同域名
http://www.a.com/lab/a.js
http://www.a.com/script/b.js 同域名下不同文件
http://www.a.com:8000/a.js
http://www.a.com/b.js 同域名下不同端口
http://www.a.com/a.js
https://www.a.com/b.js 同域名 不同協(xié)議
http://www.a.com/a.js
http://70.32.92.74/b.js 域名和域名對(duì)應(yīng)ip
http://www.a.com/a.js
http://script.a.com/b.js 主域名相同 子域名不同 是(cookie不可訪問(wèn))
http://www.a.com/a.js
http://a.com/b.js 同一域名,不同二級(jí)域名(同上)

2.跨域?qū)е铝耸裁磫?wèn)題?

瀏覽器為了安全問(wèn)題一般都限制了跨域訪問(wèn),也就是不允許跨域請(qǐng)求資源。也就是如果在a界面訪問(wèn)跨域的b界面,會(huì)被瀏覽器拒絕。但是這種需求是普遍存在的,所以就需要我們解決跨域訪問(wèn)的問(wèn)題。

3. 為什么采用Nginx的反向代理功能解決跨域

在網(wǎng)上可以看到很多的跨域的解決方案,但是大部分都需要服務(wù)器端的配合,我們采用Nginx的反向代理可以不需要通過(guò)服務(wù)器來(lái)解決這個(gè)問(wèn)題。

4. Nginx的反向代理功能解決跨域的實(shí)現(xiàn)

4.1 原理:

nginx作為反向代理服務(wù)器,就是把http請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)或者一些服務(wù)器上。通過(guò)把本地一個(gè)url前綴映射到要跨域訪問(wèn)的web服務(wù)器上,就可以實(shí)現(xiàn)跨域訪問(wèn)。對(duì)于瀏覽器來(lái)說(shuō),訪問(wèn)的就是同源服務(wù)器上的一個(gè)url。而nginx通過(guò)檢測(cè)url前綴,把http請(qǐng)求轉(zhuǎn)發(fā)到后面真實(shí)的物理服務(wù)器。并通過(guò)rewrite命令把前綴再去掉。這樣真實(shí)的服務(wù)器就可以正確處理請(qǐng)求,并且并不知道這個(gè)請(qǐng)求是來(lái)自代理服務(wù)器的。

4.2 具體解決方案如下:

在nginx.conf中編輯
然后我把項(xiàng)目部署在nginx的html根目錄下,在ajax調(diào)用時(shí)設(shè)置url從http://www.lyz.com/apistest/test變?yōu)?apis/apistest/test然后成功解決。

server {
       location / {
           root   html;
           index  index.html index.htm;
           //允許cros跨域訪問(wèn)
           add_header 'Access-Control-Allow-Origin' '*';

       }
       //自定義本地路徑
       location /apis {
           rewrite  ^.+apis/?(.*)$ /$1 break;
           include  uwsgi_params;
           proxy_pass   http://www.lyz.com;
      }
}


比如我之前請(qǐng)求的Ajax如下:

$.ajax({
       type:"post",
       dataType: "json",
       data:{'parameter':JSON.stringify(data)},
       url:"http://www.lyz.com/apistest/test",
       async: flag,
       beforeSend: function (xhr) {

           xhr.setRequestHeader("Content-Type", submitType.Content_Type);
           xhr.setRequestHeader("user-id", submitType.user_id);
           xhr.setRequestHeader("role-type", submitType.role_type);
           xhr.setRequestHeader("access-token", getAccessToken().token);
       },
       success:function(result, status, xhr){
       
       }
       ,error:function (e) {
           layerMsg('請(qǐng)求失敗,請(qǐng)稍后再試')
       }
   });

修改成如下的請(qǐng)求即可:

$.ajax({
       type:"post",
       dataType: "json",
       data:{'parameter':JSON.stringify(data)},
       url:"/apis/apistest/test",
       async: flag,
       beforeSend: function (xhr) {

           xhr.setRequestHeader("Content-Type", submitType.Content_Type);
           xhr.setRequestHeader("user-id", submitType.user_id);
           xhr.setRequestHeader("role-type", submitType.role_type);
           xhr.setRequestHeader("access-token", getAccessToken().token);
       },
       success:function(result, status, xhr){
       
       }
       ,error:function (e) {
           layerMsg('請(qǐng)求失敗,請(qǐng)稍后再試')
       }
   });

https://blog.csdn.net/l1028386804/article/details/79488328
https://blog.csdn.net/qq_31617637/article/details/72955239
http://www.mamicode.com/info-detail-2376828.html
http://seanlook.com/2015/05/17/nginx-location-rewrite/
https://blog.csdn.net/sherry_chan/article/details/79055211
https://www.cnblogs.com/zhuzhenwei918/p/6866094.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容