最简单实现跨域的方法:使用nginx反向代理

什么是跨域跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。所谓同源是指,域名,协议,端口相同。浏览器执行javascript脚本时,会检查这个脚本属于那个页面,如果不是同源页面,就不会被执行。同源策略的目的,是防止黑客做一些做奸犯科的勾当。比如说,如果一个银行的一个应用允许用户上传网页,如果没有同源策略,黑客可以编写一个登陆表单提交到自己的服务器上,得到一个看上去相当高大上的页面。黑客把这个页面通过邮件等发给用户,用户误认为这是某银行的主网页进行登陆,就会泄露自己的用户数据。而因为浏览器的同源策略,黑客无法收到表单数据。现在随着RESTFUL的流行,很多应用提供http/https接口的API,通过xml/json格式对外提供服务,实现开放架构。如,微博、微信、天气预报、openstack等网站和应用都提供restful接口。Web应用也在向单页面方向发展。越来越多的web应用现在是这样的架构:静态单个web页面ajax调用RESTFUL服务我们本可以利用各个网站提供的API,做出很多精彩的Web应用。但浏览器执行javascript时的跨域限制,就成为了这类开放架构的拦路虎。本文提出了一种简单有效的方式解决跨域问题。常用的跨域方法常用的跨域方法有这样一些:1,使用iFrame访问另一个域。 然后再从另一个页面读取iFrame的内容。jquery等有一些封装。据说Firefox等可能不支持读取另一个iFrame的内容。2,jsonp。需要服务器支持。使用script src动态得到一段java代码。是回调页面上的js函数,参数是一个json对象。jquery也有封装。3,设置http头,Access-Control-Allow-Origin:*但据说IE有一些版本不识别这个http头。4,服务器代理。如,服务器写一个url的处理action。其参数是一个url。这个服务器会用参数拼凑一个url,用httpclient库去执行url,然后把读取的内容再输出到http客户端。nginx反向代理实现跨域上面提到的这些跨域方法,都有一些问题。有的不能支持所有浏览器,有的需要修改javascript代码,有的需要重写服务器端代码。有的在session等场景下会有问题。其实,用nginx反向代理实现跨域,是最简单的跨域方式。只需要修改nginx的配置即可解决跨域问题,支持所有浏览器,支持session,不需要修改任何代码,并且不会影响服务器性能。我们只需要配置nginx,在一个服务器上配置多个前缀来转发http/https请求到多个真实的服务器即可。这样,这个服务器上所有url都是相同的域名、协议和端口。因此,对于浏览器来说,这些url都是同源的,没有跨域限制。而实际上,这些url实际上由物理服务器提供服务。这些服务器内的javascript可以跨域调用所有这些服务器上的url。下面,给出一个nginx支持跨域的例子,进行具体说明。如,我们有两个pythonflask开发的项目:testFlask1和testFlask2。testFlask2项目上的javascript脚本要通过ajax方式调用testFlask1的一个url,获取一些数据。正常情况下部署,就会有跨域问题,浏览器拒绝执行如下这样的调用。12345$("button").click(function () {$.get("127.0.0.1:8081/partners/json", function (result) {$("div").html(result);});});下面把testFlask2项目的javascrip文件修改一下。这样访问同源的url,就不会有跨域问题。12345$("button").click(function () {$.get("partners/json", function (result) {$("div").html(result);});});但是,我们testFlask2项目实际上没有partners/json这样的url,那怎么处理呢?我们这样编写nginx的配置文件:123456789101112server{listen8000;location/ {includeuwsgi_params;uwsgi_passunix:/tmp/testFlask2.sock;}location/partners {rewrite^.+partners/?(.*)$ /$1 break;includeuwsgi_params;uwsgi_passunix:/tmp/testFlask1.sock;}}我们把testFlask2项目部署在8080端口的根目录下。把提供web服务的testFlask1项目部署在/partners目录下。但我们的testFlask1项目并不能处理/partners/json这样的url请求。那怎么办呢?通过rewrite^.+partners/?(.*)$ /$1 break; 这一条命令,nginx可以把收到的/partners/*请求全部转为/*请求后再转发给背后的真实web服务器。这样,RESTFUL的ajax客户端程序,只需要给出特定前缀的url就可以调用任意服务器提供的RESTFUL接口了。甚至,通过nginx的反向代理,我们还能调用其他公司开发的网站提供的RESTFUL接口。如,12345location/sohu {rewrite^.+sohu/?(.*)$ /$1 break;includeuwsgi_params;proxy_passhttp://www.sohu.com/;}我们就把sohu网站整个搬到我们的8080:/sohu/目录下了,我们的javascript就可以尽情调用其RESTFUL服务了。顺便说一下,rewrite^.+sohu/?(.*)$ /$1 break;  这句命令中,$1表示(.*)这个部分。第一对()内的参数是$1,第二对()内的参数就是$2,以此类推。总结本文介绍了利用nginx的反向代理的功能,实现跨域访问任意应用和网站的方法。nginx是一个高性能的web服务器,常用作反向代理服务器。nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上。通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。对于浏览器来说,访问的就是同源服务器上的一个url。而nginx通过检测url前缀,把http请求转发到后面真实的物理服务器。并通过rewrite命令把前缀再去掉。这样真实的服务器就可以正确处理请求,并且并不知道这个请求是来自代理服务器的。简单说,nginx服务器欺骗了浏览器,让它认为这是同源调用,从而解决了浏览器的跨域问题。又通过重写url,欺骗了真实的服务器,让它以为这个http请求是直接来自与用户浏览器的。这样,为了解决跨域问题,只需要动一下nginx配置文件即可。简单、强大、高效!https://www.shengchulai.com/blog-bnDKP0tg5m.htm

(0)

相关推荐

  • 什么是跨域,为什么会有跨域问题的出现

    转自:https://www.cnblogs.com/cb1186512739/p/13304551.html 一.什么是同源策略? 1.同源策略/SOP(Same origin policy)是一种 ...

  • 使用Node.js搭建一个简单的http服务器

    首先你要现在你的电脑上安装好node.js 地址:https://nodejs.org/en/download/ 安装好了会出现这个: 然后写代码: //使用Node搭建一个简单的http服务器//加 ...

  • 初涉Ajax

    预备知识 JavaScript 引入javaScript , < script > 函数 选择器 标签选择器 类选择器 . id选择器 # jQuery公式 $(选择器).事件(参数) $ ...

  • Nginx 开启gzip压缩,减轻服务器压力

    Nginx 开启gzip压缩,减轻服务器压力 优化服务器的方案有很多种.常用的是缓存静态文件和开启gzip,还有cdn加速.使用cache缓存数据,本次主要根据自身的网站.采取的优化方案. 首先.Vi ...

  • 40岁以上女性保养,简单有效的3个方法!做好了省钱省事

    40岁以上女性保养,简单有效的3个方法!做好了省钱省事 ⛳养好身体的阴血, 是所有女性, 尤其是40岁以上的中老年女性, 应该关注的养生要点: 不仅可以让你少些病痛.多些健康自在, 还能够让你气色更好 ...

  • 颈椎病的征兆,10种简单的锻炼颈椎病的方法

    颈椎病的征兆 总是莫名其妙频繁落枕,半夜睡觉感觉脖子不舒服,早上醒来没精打采,睡了一觉好像更累了. 坐一会儿就觉得颈背酸痛,经过按摩会感觉舒服一点儿,但是没过几天又开始难受. 视力似乎受到了影响,没有 ...

  • WEB前端第六十二课——自封装Ajax、跨域、分页

    WEB前端第六十二课——自封装Ajax、跨域、分页

  • 想把脚气治好,最简单方便效果好的方法来了

    想把脚气治好,最简单方便效果好的方法来了 今年二月中旬左右我的左脚丫子犯起了脚气,心想这多难得的机会呀,居然长脚气以前从来没得过,不管它了,尝试尝试吧,嗯,还不错,这种感觉简直了,挠心了一周左右,不痒 ...

  • 最简单的识别主力资金的方法,指标公式

    大家都知道炒股最看重的就是能否跟上主力或者能够买到有主力进驻的票,能否判断主力的方法很多,但是真正最有效的方法却没有人知道,今天就用最简单的主力资金指标来交大家辨别主力的方法. 1.识别主力控盘力度 ...

  • Spring Boot 解决跨域问题的 3 种方案!

    前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看.Java面试宝典PDF完整版 问题背景: Same Origin ...

  • 最简单的看八字婚姻方法

    最简单的看八字婚姻方法 你的曾经的那段感情,那段心酸的事我知道,你没有告诉别人却和我倾诉我很开心.我认为我是被你信任的人,好了不说了."酸梅"不酸,不再是曾今.八字看婚姻作为流传已 ...

  • 【罗小布问道】新思维可以创造新广电(78)——《跨域,你可以获取更多的创新灵感》

    如同"用户不直接消费电,而是消费各种家用电器"一样,用户也不直接消费有线网络,而是通过家用电器消费各种应用,如电视机显示的电视节目:因此,有线电视网络服务本身就是跨域的产物.只是有 ...

  • 简单介绍珍珠的挑选方法和鉴别

    珍珠有着"珠宝皇后"的美誉,其制成的珍珠项链拥有着无可比拟的高雅气质,是众多女性朋友出息重要场合的必备之物,近年来,随着各种设计理念的创新,珍珠开始与黄金.铂金等各种材质搭配,珍珠 ...