nginx反向代理实现跨域支持跨域的主要原因是什么?
优采云 发布时间: 2021-06-28 22:13nginx反向代理实现跨域支持跨域的主要原因是什么?
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配置文件即可。简单、强大、高效!