nginx反向代理实现跨域支持跨域的主要原因是什么?

优采云 发布时间: 2021-06-28 22:13

  nginx反向代理实现跨域支持跨域的主要原因是什么?

  4、服务器代理。例如,服务器编写一个 URL 处理动作。它的参数是一个url。这个服务器会拼凑一个带参数的url,使用httpclient库执行url,然后将读取到的内容输出到http客户端。

  Nginx 反向代理实现跨域

  上面提到的这些跨域方法存在一些问题。有的不能支持所有浏览器,有的需要修改javascript代码,有的需要重写服务端代码。有的在session等场景有问题。

  其实用nginx反向代理实现跨域是最简单的跨域方式。只需要修改nginx的配置即可解决跨域问题,支持所有浏览器,支持session,不需要修改任何代码,不会影响服务器性能。

  我们只需要配置nginx,在一台服务器上配置多个前缀就可以将http/https请求转发到多台真实服务器。这样,该服务器上的所有 URL 都具有相同的域名、协议和端口。因此,对于浏览器来说,这些网址是同源的,没有跨域限制。事实上,这些 URL 实际上是由物理服务器提供的。这些服务器中的 javascript 可以跨域调用所有这些服务器上的 URL。

  下面以nginx支持跨域为例进行具体说明。

  比如我们有两个pythonflask开发的项目:testFlask1和testFlask2。

  testFlask2项目上的javascript脚本需要通过ajax调用testFlask1的一个url来获取一些数据。

  正常部署下,会出现跨域问题,浏览器会拒绝执行以下调用。

  $("button").click(function(){

  $.get("127.0.0.1:8081/partners/json",

  函数(结果){

  $("div").html(result);

  });

  });

  接下来修改testFlask2项目的javascrip文件。这样访问同一个网址就不会出现跨域问题。

  $("button").click(function(){

  $.get("partners/json",

  函数(结果){

  $("div").html(result);

  });

  });

  但是,我们的testFlask2项目实际上并没有partners/json这样的URL,那么如何处理呢?

  我们这样写nginx的配置文件:

  服务器{

  listen8000;

  位置/{

  includeuwsgi_params;

  uwsgi_passunix:/tmp/testFlask2.sock;

  }

  位置/合作伙伴{

  重写^.+partners/?(.*)$ /$1 break;

  includeuwsgi_params;

  uwsgi_passunix:/tmp/testFlask1.sock;

  }

  }

  我们在8080端口根目录下部署了testFlask2项目,在/partners目录下部署了提供web服务的testFlask1项目。

  但是我们的 testFlask1 项目无法处理像 /partners/json 这样的 URL 请求。那我们该怎么办?

  通过重写^.+partners/?(.*)$ /$1 break;这个命令,nginx可以将所有接收到的/partners/*请求转换为/*请求,然后转发到背后真正的web服务器。

  这样RESTFUL的ajax客户端程序只需要给URL一个特定的前缀就可以调用任何服务器提供的RESTFUL接口。

  即使通过nginx的反向代理,我们也可以调用其他公司开发的网站提供的RESTFUL接口。

  例如

  位置/搜狐{

  rewrite^.+sohu/?(.*)$ /$1 break;

  includeuwsgi_params;

  proxy_pass;

  }

  我们刚刚把sohu网站移到了我们的8080:/sohu/目录下,我们的javascript就可以尽可能的调用它的RESTFUL服务了。

  顺便重写^.+sohu/?(.*)$ /$1 break;在此命令中,$1 代表 (.*) 部分。第一对 () 中的参数为 $1,第二对 () 中的参数为 $2,依此类推。

  总结

  本文介绍了利用nginx的反向代理功能实现对任意应用的跨域访问以及网站方法。

  nginx 是一个高性能的 web 服务器,通常用作反向代理服务器。 nginx作为反向代理服务器,将http请求转发到另一台服务器或部分服务器。

  跨域访问可以通过将本地 URL 前缀映射到要跨域访问的 Web 服务器来实现。

  对于浏览器,您访问的是同一服务器上的 url。并且nginx通过检测url前缀将http请求转发到背后的真实物理服务器。并通过重写命令再次删除前缀。这样真实服务器就可以正确处理请求,并且不知道请求是来自代理服务器。

  简单的说就是nginx服务器欺骗了浏览器,让它认为是同源调用,从而解决了浏览器的跨域问题。通过重写 url,真正的服务器被欺骗,认为 http 请求直接来自用户的浏览器。

  这样,为了解决跨域问题,只需要移动nginx配置文件即可。简单、强大、高效!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线