Nginx跨域实现
  首先大家要搞清楚什么是跨域,为什么会有跨域情况的出现。哪些情况属于跨域?

跨域:由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容
注:同源策略,单说来就是同协议,同域名,同端口

URL 说明 是否允许通信
http://www.a.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 主域相同,子域不同 不允许
http://www.a.com/a.js
http://a.com/b.js 同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js 不同域名 不允许

跨域场景
  出于安全考虑(比如csrf攻击),浏览器一般会禁止进行跨域访问,但是因为有时有相应需求,需要允许跨域访问,这时,我们就需要将跨域访问限制打开。
  启动一个web服务,端口是8081

然后再开启一个web服务/前端服务都可以。端口是8082,然后再8082的服务中通过ajax来访问8081的服务,这就不满足同源策略,就会出现跨域问题

<%@ page language=“java” contentType=“text/html; charset=utf-8” pageEncoding=“utf-8”%>

Hello World!

![在这里插入图片描述](https://img-blog.csdnimg.cn/027c8dc30f244d6aad3eb069c40ff884.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5qC85qC85berIE1NUSEh,size_20,color_FFFFFF,t_70,g_se,x_16)

跨域问题的解决方案
  解决跨域问题的方式也有多种。

1、前后端结合(JsonP)
  虽然jsonp也可以实现跨域,但是因为jsonp不支持post请求,应用场景受到很大限制,所以这里不对jsonp作介绍。

2、纯后端方式一(CORS方式)
  CORS 是w3c标准的方式,通过在web服务器端设置:响应头Access-Cntrol-Alow-Origin 来指定哪些域可以访问本域的数据,ie8&9(XDomainRequest),10+,chrom4,firefox3.5,safair4,opera12支持这种方式。

服务器代理,同源策略只存在浏览器端,通过服务器转发请求可以达到跨域请求的目的,劣势:增加服务器的负担,且访问速度慢。

3.纯后端方式二(Nginx代理方式)【建议这种方式】
  首先配置Nginx的反向代理方式

代理访问正常

8082的服务访问Nginx,出现了跨域问题

Nginx配置跨域解决

location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods ‘GET, POST, OPTIONS’;
add_header Access-Control-Allow-Headers ‘DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization’;

if ($request_method = 'OPTIONS') {return 204;

}
proxy_pass http://192.168.12.1:8081;
}
解决了跨域问题

参数说明

Access-Control-Allow-Origin
  服务器默认是不被允许跨域的。给Nginx服务器配置Access-Control-Allow-Origin *后,表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。

Access-Control-Allow-Headers
  是为了防止出现以下错误:

Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

这个错误表示当前请求Content-Type的值不被支持。其实是我们发起了"application/json"的类型请求导致的。这里涉及到一个概念:预检请求(preflight request),请看下面"预检请求"的介绍。

Access-Control-Allow-Methods
  是为了防止出现以下错误:

Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

给OPTIONS 添加 204的返回
  是为了处理在发送POST请求时Nginx依然拒绝访问的错误,发送"预检请求"时,需要用到方法 OPTIONS ,所以服务器需要允许该方法。

预检请求(preflight request)
  跨域资源共享(CORS)标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。
  其实Content-Type字段的类型为application/json的请求就是上面所说的搭配某些 MIME 类型的 POST 请求,CORS规定,Content-Type不属于以下MIME类型的,都属于预检请求
  所以 application/json的请求 会在正式通信之前,增加一次"预检"请求,这次"预检"请求会带上头部信息 Access-Control-Request-Headers: Content-Type:

OPTIONS /api/test HTTP/1.1
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type
… 省略了一些
  服务器回应时,返回的头部信息如果不包含Access-Control-Allow-Headers: Content-Type则表示不接受非默认的的Content-Type。即出现以下错误:

Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

一篇文章让你搞懂如何通过Nginx来解决跨域问题相关推荐

  1. 一篇文章带你搞懂网络层(网际层)-- 地址篇

    网络层(Network Layer)是OSI模型中的第三层(TCP/IP模型中的网际层),提供路由和寻址的功能,使两终端系统能够互连且决定最佳路径,并具有一定的拥塞控制和流量控制的能力.相当于发送邮件 ...

  2. 一篇文章带你搞懂 DEX 文件的结构

    From:https://blog.csdn.net/sinat_18268881/article/details/55832757 Dex文件格式详解:https://www.jianshu.com ...

  3. 一篇文章带你搞懂微信小程序的开发过程

    点击上方"前端进阶学习交流",进行关注 回复"前端"即可获赠前端相关学习资料 今 日 鸡 汤 只解沙场为国死,何须马革裹尸还. 大家好,我进阶学习者. 前言 小 ...

  4. 谷歌SEO很复杂?一篇文章带你搞懂它(外贸人必读)

    这篇文章是对谷歌SEO流程的一个梳理,此文会用通俗易懂的语言告诉你做Google SEO必须知道的常识.建议和谷歌优化的方法思路. 任何关于谷歌SEO的疑问,可到此文⬇️留言,免费咨询: Google ...

  5. 一篇文章带你搞懂前端面试技巧及进阶路线

    大家好,我是若川.最近有很多朋友给我后台留言: 自己投了不少简历,但是收到的面试邀请却特别少: 好不容易收到了大厂的面试邀请,但由于对面试流程不清楚,准备的特别不充分,结果也挂了: 对于面试官的问题, ...

  6. 区块链应用 | 一篇文章让你搞懂区块链,非标通证应用将首先落地

    近期,区块链领域火热,越来越多的力量正在加入这一市场,就在昨日美图还发布了区块链白皮书. 不过,区块链市场喧嚣,陷入各种炒币的喧嚣.就在日前,CSDN副总裁孟岩以<区块链关键技术>的口述形 ...

  7. 一篇文章带你搞懂慢SQL以及优化的策略

    文章目录 一.什么是慢SQL ? 二.为什么要对慢SQL进行优化? 三.数据库性能 1. 最大数据量 2. 最大并发数 3. 查询耗时0.5秒 4. 具体实施 四.数据库表的设计 1. 数据类型 2. ...

  8. 一篇文章带你搞懂数据链路层

    数据链路层,简称链路层.两个主机之间的数据传输,总是在一段一段的链路上面传送的,也就是说,在两个相邻结点之间(主机与路由器之间 或者 两个路由器之间)传送数据是直接传送的(点对点).这时,就需要使用专 ...

  9. 一篇文章让你搞懂原型和原型链

    每一个构造函数在被创建的时候,会自动创建一个相应的对象,这个对象就是原型对象,这个函数有一个指向该对象的指针.举个例子: 下面创建了一个函数person. function person () { } ...

  10. 一篇文章带你搞懂JS对象的自我销毁

    在日常的JS组件开发中,往往会有一些较为复杂的DOM操作及事件监听,尤其是在处理UI层面的widgets时候更为明显.常常会花很多精力在对象的init上,而当组件需要被移除时则仅仅是把所在DOM草草的 ...

最新文章

  1. js 判断字符串是否包含某字符串
  2. 子报表修改后需要重新导入,0.00显示.00的调整方法
  3. [蓝桥杯][历届试题]小朋友排队(树状数组)
  4. c++ 标准库类型string
  5. 完全二叉树子节点个数
  6. Visual Studio二次安装时无法更改安装位置解决方案
  7. linux使用.rpm包安装mysql
  8. 在java反射中 Class.forName和classLoader的区别
  9. ROS下面调用自定义的头文件和.cpp/.so文件(亲测有效)
  10. Spring Bean作用域
  11. 计算机ec键起什么作用,主板acpi 隐形的管家——EC的EC控制器芯片芯片手册
  12. unity material以及各种贴图介绍
  13. 带参数矩阵求逆(matlab)
  14. python爬虫自动更换ip_python爬虫:自动投票代码(自动爬取代理IP)
  15. 为什么计算机集群叫云,为什么叫云计算?
  16. 创建一个动态空间存储未知大小的二维数组
  17. 钛磨产品行业调研报告 - 市场现状分析与发展前景预测
  18. 苹果手机计算机怎么看以前的记录,苹果手机怎么查找以前的历史通话记录
  19. html在线预览ppt excel,JavaScript实现Word、Excel、PPT在线预览
  20. vue—实现组织架构图(vue-org-tree插件)——技能提升

热门文章

  1. 配对交易之统计套利配对:介绍
  2. php 判断时间是星期几,通过PHP的date()函数判断今天是星期几
  3. 实用计算机理论基础知识试题及答案,计算机基础知识试题库及答案(5)
  4. python描述对象静态特性的数据为_短期借款利息数额不大,可以直接支付,不预提,在实际支付时直接记入的账户是( )。...
  5. kali linux 安装中文乱码,Kali Linux 2019-4解决安装中文乱码-Go语言中文社区
  6. ROS快速入门第三讲——ROS的Subscriber订阅者
  7. 什么是面形误差PVr?【光学测量、光学设计必看】
  8. 1393: 国防部长PIPI
  9. 献给面试学生 关键字const是什么意思 ESP(译者:Embedded Systems Programming) --Dan Saks概括了const的所有用法
  10. 树梅派应用38:树莓派 SAKS 扩展板挑战应用 之 PM2.5 指示灯