用Nginx代理请求,处理前后端跨域
自从前端spa框架出现后,都是前后端分离开发了。我们在开发的时候难免会遇到跨域的问题。跨域这种问题解决的方法基本都是在服务端实现的。以java为例,我知道的有3种方法处理跨域:
1.使用 @CrossOrigin 注解对每一个接口进行跨域处理,缺点是比较麻烦
@CrossOrigin(origins ="*")
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() {
return "test";
}
2.使用 @CrossOrigin 在入口类对所有接口进行跨域处理
@CrossOrigin(origins = "*")
@RestController
@SpringBootApplication
public class SpringBootCorsTestApplication {
// ***
}
3.还可以添加一个配置类,对所有的接口进行跨域处理
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.maxAge(3600)
.allowCredentials(true);
}
}
但是...我们项目组的后端他们不在代码中处理跨域,通过线上的nginx统一配置跨域处理...我们前端用的vue,vue配置中是有对于开发跨域的处理,由于我们项目的特殊性,并不适合我们(我们一套代码会运行会部署在不同的服务器,至少3套,前后端代码有差异,我们通过gitlab分支解决代理管理,我们将差异抽离出来成为不同版本代码的配置,例如不同的后台api接口地址,刚开始我们前端代码在构建的时候将配置打进去,发现这样还是代码和配置傻傻分不清楚,这样子处理的不是很好,我们为了前端代码和配置的彻底分离,将代码和配置分别建立两个gitlab仓库,前端项目构建的时候只是构建代码,配置会在部署的时候通过脚本对特定环境进行替换,我感觉跟猴子补丁有点类似,以此来达到跟后台java一样一套代码,运行时用不同命令读取不同的配置运行)本着自己散装的nignx配置了解,可以通过本地nginx做一个请求代理转发,然后在nginx中处理跨域
server {
listen 9090;
server_name localhost;
location /{
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' '*';
if ($request_method = "OPTIONS") {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' '*';
add_header 'Content-Length' 0;
add_header 'Content-Type' 'text/plain, charset=utf-8';
return 204;
}
proxy_pass http://192.168.0.3:9999;
}
#location /aepreservation {
#
# add_header 'Access-Control-Allow-Origin' $http_origin;
# add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
# add_header 'Access-Control-Allow-Headers' '*';
# if ($request_method = "OPTIONS") {
# add_header 'Access-Control-Allow-Origin' $http_origin;
# add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
# add_header 'Access-Control-Allow-Headers' '*';
# add_header 'Content-Length' 0;
# add_header 'Content-Type' 'text/plain, charset=utf-8';
# return 204;
# }
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
# proxy_pass http://192.168.0.3:9999;
#}
}
nginx监听本地端口9090的所有端口,并转发到对应的后端服务(假如你们后台服务的地址为 http://192.168.0.3:9999/api/*,我们的前端代理只要访问 http:localhost:9090/api/*就可以了,注意下方我注释的地方是代理websocket的方法,路径是/aepreservation,我当时为了偷懒(正则看着头疼),抄了一份上边的配置,ningx是可以通过正则判断的,只对确定的websocket路径进行处理,不用向我一样写的这么啰嗦
用Nginx代理请求,处理前后端跨域的更多相关文章
- 使用nginx反向代理处理前后端跨域访问
本文主要解决:使用nginx反向代理处理前后端跨域访问的问题 1.何为跨域访问? 以下类型为跨域访问 1)不同域名间访问 www.zuiyoujie.com和www.baidu.com 2)同域名不同 ...
- 简单设置,解决使用webpack前后端跨域发送cookie的问题
最近用vue来做项目,用webpack来做前端自动化构建.webpack-dev-server会在本地搭建一个服务器,在和后端调试的时候,就会涉及到跨域的问题. 刚开始时,没有用vue-cli来构建项 ...
- nginx代理天地图做缓存解决跨域问题
作为一个GISer开发者,天地图是经常在项目中以底图的形式出现,其加载地址如: 天地图矢量:http://t{0-6}.tianditu.com/DataServer?T=vec_w&x={x ...
- 搭建nginx代理,为前端页面跨域调用接口
前端同学因开发需要,本地搭建的服务需要调用其它域名的接口,在帮助正确配置后,已能正常使用. 这里写一篇博客,记录一下. 前端页面地址为127.0.0.1:9813/a.html 接口地址http:// ...
- 前后端跨域 _ cross domain
1. 解决跨域既可以从前端, 也可以从后端. 参考好的网络资源: http://www.cnblogs.com/vajoy/p/4295825.html
- vue解决前后端跨域问题
1/在config中index.js中 找到proxyTable在里面添加如下代码 proxyTable: { '/api': { target: 'https://api.douban.com/v2 ...
- springboot2.1.3 配置前后端跨域问题
很简单,创建一个配置类即可,如下: package com.app.gateway.common.config; import org.springframework.context.annotati ...
- 获取登录验证码失败及前后端不同域导致session丢失问题分析记录
前言 前两周在把兄弟公司的几个服务部署到我们公司测试环境服务器的时候又遇到了不少问题,因为是前后端分离的项目,所以这次也同样遇到了跨域问题,解决方式也跟上一回的不一样,这里就再来分析记录一下. 登录验 ...
- Nginx:多项目开发配置跨域代理
简述Nginx应用场景(前后端) 当我们开发 vue 项目中可以通过 proxyTable 进行跨域,但如果是原生的 html+css+js ,或者其他没有跨域插件的项目中,想要跨域就要引入配置许多的 ...
随机推荐
- CSS3画五角星和六角星
最终想要实现的效果 一.五角星 在画五角星之前首先分析这个五角星是如何实现,由哪几个部分构成的,示意图如下: 三个顶角向上的三角形,通过设置旋转和定位相互重叠和拼接实现最终的五角星效果. 为了语义化和 ...
- [luogu]P2680 运输计划[二分答案][树上差分]
[luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...
- 【bzoj1096】[ZJOI2007]仓库建设
*题目描述: L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总 ...
- getchar、getch、getche 与 gets()
一.getchar.getch.getche 1.getchar() getchar()从输入缓冲区读入一个字符,并返回这个字符的ASCII码(即函数返回值为int型),出错返回-1(EOF):如果用 ...
- 使用visual studio配置和运行《opengl圣经》的第一个案例
对vc++新手来说,想把opengl圣经里的教学案例运行起来还真不是一件容易的事情,而且并没有完整的操作流程教学,这里就总结一下吧: 先安装cmake,用于生成vs的工程文件,安装过程中选中“将目录添 ...
- Mybatis, 实现一对多
我这里是拿商品做为例子 不多说直接上代码 Mapper.xml <?xml version="1.0" encoding="UTF-8"?> < ...
- vue+ts修改父组件属性的写法。
部分代码如下: 父组件: <coupon :modifyFlag.sync="flag" /> data() { return { fl ...
- Django学习之数据库与ORM
二.ORM表模型 表(模型)的创建: 1.ORM之增(create.save) 一对多(ForeignKey): 多对多(ManyToManyField()): 2.ORM之删(delete) 3.O ...
- PowerBI 的简单介绍
一 切片器 给我的感觉就是groupby,就是按照某个维度进行了分组,然后显示. https://www.jianshu.com/p/2e78bf342747 二 建模 https://zhuan ...
- nginx proxy_pass 和 proxy_redirect
proxy_pass:充当代理服务器,转发请求proxy_redirect:修改301或者302转发过程中的Location.默认值为proxy_redirect default. 例:locatio ...