Nginx处理前端跨域(补充)
在之前的博客中提到了用nginx来处理前后端跨域问题,用Nginx代理请求,处理前后端跨域 ,虽然解决当时了问题,但是在实际使用中还是不好用,当时应对的只是对单接口的处理,如果一个页面需要调用两个不同接口(对应后台的不同工程)时候就出问题了。出现这种问题的原因跟后端开发人员工程混乱也有关系,比如a项目代码中处理了跨域,b项目在nignx代理上做了跨域处理。而我的处理办法是针对所有的请求在本地都添加 Access-Control-Allow-Origin 为 $http_origin (nignx特有字段,意思是请求域)字段到服务端,单独访问a项目是没问题的,如果在调用a项目的时候同时调用b项目就会报错,浏览器提示 Access-Control-Allow-Origin 字段被写了两次,报错类似下边:
Access to XMLHttpRequest at 'http://localhost:9090/getUser' from origin 'http://a.com' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values 'http://a.com, *, but only one is allowed.
最简单粗暴的办法是针对后台接口每个做不同的处理,拜托,这tm太麻烦了。。。最后想到了一个问题,我可以用nginx把前端代码和后台代码代理到同一端口,这不就大功告成了吗。。。开始搞起来,nginx配置文件如下:
upstream test01{
server b.com; // 服务器a
}
upstream test02{
server a.com; // 服务器b
}
server {
listen 80; // 将前后端代理到同一端口
server_name localhost;
location /user {
proxy_pass http://test01; // user接口
}
location /role{
proxy_pass http://test01; // role接口
}
...
location / {
proxy_pass http://127.0.0.1:8080; // 前端工程地址,不能是localhost
}
}
注意一个细节,我打注释的地方,必须为127.0.0.1,刚开始的时候我写的localhost,前端项目跑起来的后,访问 http://localhost ,发现本地静态js文件一直pending状态,过好长时间才能访问,这不能忍啊...为啥访问个本地文件都这么慢?难道是我开代理的问题吗?难道是本地hosts文件没有配置localhost吗?就差临门一脚了,就是用不了。。。过了好长时间,我偶然间将localhost修改为127.0.0.1,我重新跑起项目,哈,这酸爽....
现在开发调试问题是解决了,但是强迫症的我,看着后台接口那一堆location很少头疼(代码中我用...省略了),于是我在想能不能把所有的接口地址写一块,省的写那么多相同的 proxy_pass http://test01; ,比如我说我要切换一台服务器测试,我得改那么多的proxy_pass 。。。
最终我用正则改进了这种写法(有的人可能觉得之前的写法清晰,看个人喜好吧?我是强迫症忍不了啊 。。。),改完的配置如下,只需将后台接口location写到一块:
location ~ ^/(user|role|...) {
proxy_pass http://test01; // user接口
}
Nginx处理前端跨域(补充)的更多相关文章
- 【Nginx】在Windows下使用Nginx解决前端跨域问题
提出问题:因为一些历史原因,后台代码不能动.请求别人的接口拿数据显示在前端,怎么办呢? 分析问题:通过ajax请求. 解决问题:因为浏览器的同源策略,所以需要解决跨域问题.(同源策略:请求的url地址 ...
- 如何用Nginx解决前端跨域问题?
前言 在开发静态页面时,类似Vue的应用,我们常会调用一些接口,这些接口极可能是跨域,然后浏览器就会报cross-origin问题不给调. 最简单的解决方法,就是把浏览器设为忽略安全问题,设置--di ...
- 用nginx解决前端跨域问题
假如前端你项目部署在nginx的根目录下,然后项目需要请求后台小伙伴写的接口 nginx配置: #user nobody; worker_processes 1; #error_log logs/er ...
- nginx解决前端跨域配置
在nginx.conf文件中 添加如上配置: 在ajax中将原来的 url:http://192.168.1.127:8905/findItem 改成:'http://localhost/findIt ...
- 用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面
用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面 1.什么是跨域以及产生原因 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,或是a页面为ip地 ...
- 项目部署问题:xftp无法连接服务器、Nginx403 Forbidden解决、nginx反向代理解决前端跨域问题
一.xftp无法连接服务器 在xftp中配置正确的ip,用户名和密码后,居然无法连接 解决方案:将协议里面的FTP换成SFTP,注意换成SFTP后端口就默认换成22,要还是原来的21就还是连不上的哈 ...
- 前端跨域实现的几种方式?及使用Nginx反向代理配置。
早期为了防止CSRF(跨域请求伪造)的攻击,浏览器引入了同源策略(SOP)来提高安全性.而所谓"同源策略",即同域名(domain或ip).同端口.同协议的才能互相获取资源,而不能 ...
- 使用Nginx来解决跨域的问题
使用Nginx来解决跨域的问题 nginx的版本:(查看nginx命令: /usr/local/nginx/sbin/nginx -v) nginx/1.4.3 问题是:前端项目域名是 a.xxxx. ...
- 使用nginx实现浏览器跨域请求
跨域访问问题, 相信很多人都遇到过, 并且都用不同的办法去解决过. 方法有很多种, 不一一叙述了. 这里主要使用nginx反向代理来解决跨域问题. 啥是跨域? 假如你是百度开发人员, 在百度页面去请求 ...
随机推荐
- java 如何实现大文件上传下载(传输)各种格式
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- luogu 5471 [NOI2019]弹跳 KDtree + Dijkstra
题目链接 第一眼就是 $KDtree$ 优化建图然而,空间只有 $128mb$,开不下 时间不吃紧,考虑直接跑 $Dijkstra$ $Dijkstra$ 中存储的是起点到每个输入时给出的矩阵的最 ...
- POJ 3181 Dollar Dayz ( 完全背包 && 大数高精度 )
题意 : 给出目标金额 N ,问你用面额 1~K 拼成 N 的方案有多少种 分析 : 完全背包的裸题,完全背包在 DP 的过程中实际就是列举不同的装填方案数来获取最值的 故状态转移方程为 dp[i] ...
- #433 Div2 Problem C Planning (贪心 && 优先队列)
链接 : http://codeforces.com/contest/854/problem/C 题意 : 有 n 架飞机需要分别在 1~n 秒后起飞,允许起飞的时间是从 k 秒后开始,给出每一架飞机 ...
- 软件安装——internal error2503/2502
安装新的软件后先报internal error 2503,随后报internal error 2502.就是不让我装新的软件,提示说发生严重错误,然后安装失败. Solution for intern ...
- 【HDOJ6731】Angle Beats(极角排序)
题意:二维平面上给定n个整点,q个询问 每个询问给定另外的一个整点,问其能与n个整点中任意取2个组成的直角三角形的个数 保证所有点位置不同 n<=2e3,q<=2e3,abs(x[i],y ...
- RabbitMQ绑定、队列、消息、虚拟主机详解(五)
Binding:绑定,Exchange和Exchange.Queue之间的连接关系 Binding中可以包含RoutingKey或者参数 Queue:消息队列,实际存储消息数据 Durability: ...
- python中的实例属性和类属性
在python中,类属性和实例属性的区别是什么? 我认为是作用域的不同,实例对象可以访问类属性,类对象不可以访问实例属性.(类的概念本身就是作用域的概念,你不能让一只猫会飞,猫属于猫类,这一类都不会飞 ...
- VMware 虚拟机的虚拟磁盘编程知识点扫盲之二
目录 目录 前文列表 VDDK 安装 VDDK VixDiskLib VADP 前文列表 VMware 虚拟机的虚拟磁盘编程知识点扫盲之一 VDDK 摘自官方文档:The Virtual Disk D ...
- Delphi XE2 之 FireMonkey 入门(22) - 数据绑定: BindingSource、BindingName、FindBinding()、Binding[]
在窗体上添加 TrackBar1.Edit1.Label1, 然后设置属性(可在设计时): procedure TForm1.FormCreate(Sender: TObject); begin ...