如何用nginx解决跨域问题
先来说一下什么是同源策略
同源(域名、协议、端口相同)策略是一种约定,是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,浏览器的正常功能将受到影响。
什么是跨域?
跨域就是跨域名,跨端口,跨协议(非同源策略)。
跨域分类
简单说,跨域分为 简单跨域 和 复杂跨域。
简单跨域:不会发送OPTIONS请求。
复杂跨域:会发送一个预检查OPTIONS请求。
复杂跨域的条件是:
①、非GET、HEAD、POST请求。
②、POST请求的Content-Type不是application/x-www-form-urlencoded, multipart/form-data, 或text/plain。
③、添加了自定义header,例如Token。
跨域请求浏览器会在Headers中添加Origin,通常情况下不允许用户修改其值。
Nginx解决跨域问题
跨域是前后端分离开发中非常常见的问题。无论用什么编程语言,现在都已经很难离开Nginx。因此直接在Nginx中处理跨域问题有得天独厚的优势。当出现跨域问题的时候,只需要给Nginx服务器配置响应的header参数即可。
只需要在Nginx的配置文件中配置以下参数:
1 2 3 4 5 6 7 8 |
|
上面的配置代码即可解决跨域问题了,不想深入研究的,看到这里就可以了=-=
解释
1、Access-Control-Allow-Origin
服务器默认是不被允许跨域的。给Nginx配置Access-Control-Allow-Origin * 后,表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。也就是说,表示接受任意域名的请求。上面我们这里设置的是* 这是最简单粗暴的方式,但是服务器出于安全考虑,肯定不会这么干,而且,如果是*的话,游览器将不会发送cookies数据(如果需要携带cookies数据,则需要设置 'Access-Control-Allow-Credentials:true')。
所以Access-Control-Allow-Origin一般都是设置为 指定域(也就是指定 某一个url来请求我服务器)的方式。指定域 设置的方式如下:
add_header Access-Control-Allow-Origin 'www.test.com'; 注意:只能指定一个域
2、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)。请看下面"预检请求"的介绍。
3、Access-Control-Allow-Methods 是为了防止出现以下错误:
Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
4、给OPTIONS 添加 204的返回,是为了处理在发送POST请求时Nginx依然拒绝访问的错误
发送"预检请求"时,需要用到方法OPTIONS,所以服务器需要允许该方法。
预检请求(preflight request)
其实上面的配置涉及到了一个W3C标准:CROS,全称是跨域资源共享 (Cross-origin resource sharing),它的提出就是为了解决跨域请求的。
跨域资源共享(CORS)标准新增了一组HTTP 首部字段,允许服务器声明哪些源站有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。
其实Content-Type字段的类型为application/json的请求 就是上面所说的搭配某些 MIME 类型的 POST 请求,CORS规定,Content-Type不属于以下MIME类型的,都属于预检请求:
1 |
|
POST请求中的Content-Type不是上面这三种的其中一种的话,都属于预检请求。(上面也有提到过,就是 复杂跨域的条件中的第②步)
所以 application/json的请求 会在正式通信之前,增加一次"预检"请求,这次"预检"请求会带上头部信息 Access-Control-Request-Headers: Content-Type:
1 |
|
服务器回应时,返回的头部信息如果不包含Access-Control-Allow-Headers: Content-Type则表示不接受非默认的的Content-Type。
即出现以下错误:
Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
尾声
解决跨域的解决方案有很多种,最常见也是最传统的解决方式是使用JSONP的方式。CORS与JSONP的使用目的相同,但是比JSONP更强大。
JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
如何用nginx解决跨域问题相关推荐
- 前端如何使用proxyTable和nginx解决跨域问题
前端如何使用proxyTable和nginx解决跨域问题 参考文章: (1)前端如何使用proxyTable和nginx解决跨域问题 (2)https://www.cnblogs.com/webhmy ...
- 使用nginx解决跨域问题
1.跨域解释 1.1 怎么知道我遇到了跨域问题 如果项目没做前后端分离,是不会有跨域问题的.前后端分离的项目中,前端调用后台服务时,报错 No 'Access-Control-Allow-Origin ...
- 无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离
近年来,前后端分离已经成为中大型软件项目开发的最佳实践. 在技术层面,前后端分离指在同一个Web系统中,前端服务器和后端服务器采用不同的技术栈,利用标准的WebAPI完成协同工作.这种前后端分离的&q ...
- Nginx 解决跨域问题
什么是跨域 当一个请求url的协议.域名.端口三者之间任意一个与当前页面url不同即为跨域 nginx解决跨域请求 nginx.config配置 server {listen 80;server_na ...
- VUE部署nginx解决跨域问题
VUE部署nginx解决跨域问题 Vue的代理跨域问题,需要确定的是在开发阶段可以使用,部署到服务器后出现请求失败的问题(404),如下图. VUE配置的代理 Vue的代理跨域问题,需要确定的是在开发 ...
- nginx解决跨域问题
在我们前端开发的过程中, 相信大家都遇到过一个让人头疼的问题,那就是跨域问题. 跨域解决的方式有很多,这里主要讲的是如何来使用 nginx来解决我们所遇到的跨域问题 首先,在我们开始之前,首先要知道跨 ...
- Nginx 解决跨域
项目准备 前端网站地址:http://localhost:8080 服务端网址:http://localhost:8081 确认服务端是没有处理跨域的,先用postman测试服务端接口是正常的 当前端 ...
- Nginx解决跨域问题的具体实现
解决方案 使用add_header指令,该指令可以用来添加一些头信息 语法 add_header name value... 默认值 - 位置 http.server.location 此处用来解决跨 ...
- vue项目中如何用代理解决跨域,什么是代理
1.为什么要用代理 举一个简单的例子,一般情况下一个公司里面最多的就是ip不同,比方说前端ip是192.168.0.7,后端ip是192.168.0.8,由于ip不同是不能访问后端资源的,不仅仅是ip ...
最新文章
- 【转】Linux思维导图
- Django 笔记-20190521
- 团队项目个人进展——Day05
- docker 命令详解(cp篇)
- 2016计算机课程设计,2016年计算机组成原理课程设计-硬布线控制器的设计.doc
- Unity3D - UGUI的手动搭建
- 六、pink老师学习笔记——CSS三角形之美 margin负值之美文字围绕浮动元素行内块元素布局的巧妙运用
- deepl windows_推荐一个为程序员深度开发的翻译插件DeepL
- python语言开发平台_Go+Python双语言混合开发
- CentOS7安装wxWidgets错误解决
- 《DOM编程艺术》中CSS—DOM的总结(一)
- android之activity跳转
- APP性能测试之monkey
- 乐视盒子u4刷Android,乐视盒子u4安装优酷
- java servlet api.jar_servlet-api.jar包下载
- 命令行工具解析Crash文件,dSYM文件进行符号化
- 给机器人罗宾写一封英语回信_小学英语人教(13版三起点)六年级上册Unit1
- action mutation 调用_Vuex源码学习(七)action和mutation如何被调用的(调用篇)
- 【微机原理与接口技术】学习笔记8 串行通信和8250芯片
- Prometheus 四种metric类型
热门文章
- springboot整合bootstrap pagehelper分页插件 mybaties 做多表头表格查询列表
- 通过SSH Client设置规避SSH定时断开
- python三维建模_3D One 2.5引爆新思维,用趣味编程来实现3D建模!
- 级差公排php如何_什么是分数级差 怎么录取
- Mac怎么用, 写在升级Mojave前
- 怀孕可以健身吗?须注意什么?
- 被黑产攻击后的血泪控诉…
- C++大数BigInt
- 学习笔记(1):QT/C++从新手到老手系列之QT基础篇-Qt基础篇关于源代码、开发环境下载及使用...
- 在Ubuntu 9.10下成功安装Fcitx输入法