`
kavy
  • 浏览: 888700 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用nginx的反向代理机制解决前端跨域问题

 
阅读更多

https://www.cnblogs.com/gabrielchen/p/5066120.html

 

1.什么是跨域以及产生原因

  跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。

  跨域情况如下:

 

url 说明 是否跨域
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
同一域名,不同协议
http://www.a.com/a.js
http://70.32.92.74/b.js
域名和域名对应ip
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同 是(cookie不可访问)
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上)

 

2.跨域的常见解决方法

目前来讲没有不依靠服务器端来跨域请求资源的技术

  1.jsonp 需要目标服务器配合一个callback函数。

  2.window.name+iframe 需要目标服务器响应window.name。

  3.window.location.hash+iframe 同样需要目标服务器作处理。

  4.html5的 postMessage+ifrme 这个也是需要目标服务器或者说是目标页面写一个postMessage,主要侧重于前端通讯。

  5.CORS  需要服务器设置header :Access-Control-Allow-Origin。

  6.nginx反向代理 这个方法一般很少有人提及,但是他可以不用目标服务器配合,不过需要你搭建一个中转nginx服务器,用于转发请求。

3.nginx反向代理解决跨域

  上面已经说到,禁止跨域问题其实是浏览器的一种安全行为,而现在的大多数解决方案都是用标签可以跨域访问的这个漏洞或者是技巧去完成,但都少不了目标服务器做相应的改变,而我最近遇到了一个需求是,目标服务器不能给予我一个header,更不可以改变代码返回个script,所以前5种方案都被我否决掉。最后因为我的网站是我自己的主机,所以我决定搭建一个nginx并把相应代码部署在它的下面,由页面请求本域名的一个地址,转由nginx代理处理后返回结果给页面,而且这一切都是同步的。

 

  关于nginx的一些基本配置和安装请看我的另一篇博客,下面直接讲解如何配置一个反向代理。

 

  首先找到nginx.conf或者nginx.conf.default 或者是default里面的这部份   

          

   其中server代表启动的一个服务,location 是一个定位规则。

location /{   #所有以/开头的地址,实际上是所有请求

root  html     #去请求../html文件夹里的文件,其中..的路径在nginx里面有定义,安装的时候会有默认路径,详见另一篇博客

index  index.html index.htm  #首页响应地址

}

  

  从上面可以看出location是nginx用来路由的入口,所以我们接下来要在location里面完成我们的反向代理。

  假如我们我们是www.a.com/html/msg.html 想请求www.b.com/api/?method=1&para=2;

  我们的ajax:

var url = 'http://www.b.com/api/msg?method=1&para=2';

$.ajax({ type: "GET", url:url, success: function(res){..}, .... })

  

  上面的请求必然会遇到跨域问题,这时我们需要修改一下我们的请求url,让请求发在nginx的一个url下。

var url = 'http://www.b.com/api/msg?method=1&para=2'; 
var proxyurl = 'msg?method=1&para=2';
//假如实际地址是 www.c.com/proxy/html/api/msg?method=1&para=2; www.c.com是nginx主机地址
 $.ajax({ 
type: "GET", 
url:proxyurl, 
success: function(res){..}, 
.... 
})  

  

  

  再在刚才的路径中匹配到这个请求,我们在location下面再添加一个location。

location ^~/proxy/html/{
rewrite ^/proxy/html/(.*)$ /$1 break;
proxy_pass http://www.b.com/;
}

以下做一个解释

1.'^~ /proxy/html/ '

  就像上面说的一样是一个匹配规则,用于拦截请求,匹配任何以 /proxy/html/开头的地址,匹配符合以后,停止往下搜索正则。

2.rewrite ^/proxy/html/(.*)$ /$1 break;

  代表重写拦截进来的请求,并且只能对域名后边的除去传递的参数外的字符串起作用,例如www.c.com/proxy/html/api/msg?method=1&para=2重写。只对/proxy/html/api/msg重写。

  rewrite后面的参数是一个简单的正则 ^/proxy/html/(.*)$ ,$1代表正则中的第一个(),$2代表第二个()的值,以此类推。

  break代表匹配一个之后停止匹配。

3.proxy_pass

  既是把请求代理到其他主机,其中 http://www.b.com/ 写法和 http://www.b.com写法的区别如下:

不带/

 location /html/
{
  proxy_pass http://b.com:8300;  
}

带/

location /html/  
{  
    proxy_pass http://b.com:8300/;  
} 

上面两种配置,区别只在于proxy_pass转发的路径后是否带 “/”。

  针对情况1,如果访问url = http://server/html/test.jsp,则被nginx代理后,请求路径会便问http://proxy_pass/html/test.jsp,将test/ 作为根路径,请求test/路径下的资源。

  针对情况2,如果访问url = http://server/html/test.jsp,则被nginx代理后,请求路径会变为 http://proxy_pass/test.jsp,直接访问server的根资源。

 

修改配置后重启nginx代理就成功了。

 

 

 

参考:http://seanlook.com/2015/05/17/nginx-location-rewrite/

         http://www.jbxue.com/article/2187.html

 

server { 
listen       80; 
server_name  A.ABC.com; 
location / { 
proxy_pass http://localhost:1234; 
proxy_set_header   Host    $host; 
proxy_set_header   X-Real-IP   $remote_addr; 
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 
} 

另外一个:

server { 
listen       80; 
server_name  B.ABC.com; 
location / { 
proxy_pass http://localhost:4321; 
proxy_set_header   Host    $host; 
proxy_set_header   X-Real-IP   $remote_addr; 
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 
} 
分享到:
评论

相关推荐

    Tomcat+Nginx反向代理部署前后端分离项目解决跨域问题

    最近自己做了一个前后端分离项目,前端采用HBuilderX开发,后端采用IDEA开发,在本地开发也跨域,部署到云服务器也跨域,下面介绍两种解决方案。 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定...

    nginx安装, 解决跨域问题

    **Nginx安装与解决跨域问题** 在现代Web开发中,由于浏览器的同源策略,跨域问题经常出现,限制了不同源之间的通信。Nginx作为一个高性能的反向代理服务器,常被用于处理此类问题。本篇将详细介绍如何在Linux环境下...

    nginx跨域问题,解决多端口,多ip问题

    解决这种问题的方法是使用 Nginx 的反向代理功能,将前端请求代理到后端服务器上。 二、代码逻辑优化 代码逻辑优化是指对 Nginx 配置的优化,以提高服务器性能和安全性。其中包括前端配置、后端配置和服务器配置三...

    nginx解决跨域问题的实例方法

    跨域问题在现代Web开发中是一个常见的挑战,尤其是在前后端分离的架构中。浏览器的同源策略限制了JavaScript从一个源获取另一个源的数据,而Nginx作为一...不过,Nginx的反向代理方案已经能解决大部分基本的跨域问题。

    Vue中跨域及打包部署到nginx跨域设置方法

    在当今的web开发过程中,...本文介绍了在Vue项目开发阶段使用webpack配置代理解决跨域的方法,以及在生产环境中如何配置Nginx服务器,确保前端项目在不同环境下都能够正常访问后端资源,保证前后端分离项目的顺利进行。

    如何用Nginx解决前端跨域问题

    总之,利用Nginx解决前端跨域问题是一种常见的实践方式,它允许我们在不影响应用功能的前提下,灵活地处理跨域请求,为开发和部署提供了便利。在实际操作中,根据具体需求,可能还需要关注其他Nginx配置项,如添加...

    利用Nginx代理如何解决前端跨域问题详析

    在现代Web开发中,前后端分离的架构已经成为...总的来说,通过Nginx反向代理,我们可以有效地解决前端跨域问题,同时还能通过配置Nginx来实现更多的功能,如负载均衡、缓存控制等,进一步优化Web应用的性能和安全性。

    nginx实现跨域访问遇到的问题

    前端跨域请求的解决方案是使用方向代理方式来让域名和端口转向,实现不跨域。Nginx 可以解决域名、协议、端口、上下文根的匹配转向问题,只需要对 HTTP 请求头做修改,重新封装这个包。 Nginx 代理配置 -----------...

    nginx解决跨域案例

    总结,Nginx作为强大的反向代理服务器,能够轻松地解决跨域问题。通过配置合适的响应头,Nginx可以确保前端应用在遵循浏览器同源策略的同时,能够与不同源的后端服务进行有效通信。理解并熟练掌握这一技术对于前后端...

    前端后端跨域问题

    ### 前端后端跨域问题解析及解决方案 #### 跨域问题概述 跨域问题,即Cross-Origin Resource Sharing(CORS),是指浏览器出于安全考虑,在不同源之间执行网络请求时实施的一种限制机制。根据同源策略的规定,只有...

    使用Nginx 反向代理来避免 ajax 跨域请求的方法

    因为对前端不熟悉,以为用 ajax 就可以不需要 callback ,然而前端的同学说不跨域的情况下才不需要 callback ,让我在返回的 json 里加上。可是我刚刚学会了最基本的 spring-mvc 用法,根本不知道怎么加上 callback ...

    nginx.conf

    nginx方式解决跨域请求,配置文件中将前端和后端反向代理到nginx服务器,使得前后端遵循同源策略,就不会有跨域请求的问题了

    nginx解决前后分离开发跨域问题

    为了解决这个问题,我们可以利用Nginx作为反向代理服务器,将前端的请求转发到后端服务,从而绕过跨域限制。 Nginx是一款高性能、轻量级的HTTP和反向代理服务器,因其强大的负载均衡能力和高效的性能而广泛应用于...

    解决 springboot跨域请求问题

    而Nginx反向代理在大型项目或生产环境中更为常见,因为它提供了更多的灵活性和性能优化选项,例如缓存、负载均衡等。 总的来说,解决SpringBoot的跨域问题需要理解同源策略和CORS机制,并根据项目规模和需求选择...

    signalR跨域及解决方案

    例如,使用 Nginx 或 Apache 作为反向代理服务器。 4. **IFrame 和 PostMessage:** 对于需要复杂交互的情况,可以在目标域上创建一个 IFrame,并通过 `window.postMessage` API 与外部窗口通信。不过,这种方法...

    nginx跨域代理

    为了解决这个问题,开发者通常会利用Nginx作为跨域代理服务器,通过配置Nginx的反向代理功能来实现跨域请求。本篇将详细讲解如何使用Nginx实现跨域代理,并以提供的`nginx-1.14.2`压缩包文件为例,介绍配置过程。 *...

    vue+springboot前后端分离工程跨域问题解决方案解析

    为了解决跨域问题,可以使用代理服务器来转发请求。假设前端A要去访问服务器C,可以在A和C之间设置一个代理B,A访问C时先访问B,再由B代为请求C并把请求结果返回给A,这样就可以解决跨域问题。其中需要保证的是A访问...

    vue打包使用Nginx代理解决跨域问题

    使用nginx配置反向代理,这样就可以在前端彻底解决跨域问题。 vue index.js文件源码 'use strict' // Template version: 1.2.7 // see http://vuejs-templates.github.io/webpack for documentation. const path...

    WEB前端关于跨域问题的8种解决方案

    8. **Nginx或Apache配置**:通过修改服务器配置,例如Nginx的反向代理或Apache的mod_proxy模块,可以将跨域请求重定向到同一源的服务器,实现跨域访问。 在选择解决方案时,需要考虑实际需求、兼容性和安全性等因素...

Global site tag (gtag.js) - Google Analytics