数据库教程:如何使用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的配置文件中配置以下参数:

location / { ``  ``add_header access-control-allow-origin *;``  ` `  ``add_header ``'access-control-allow-credentials'` `'true'``; ``# 是否允许后续请求携带cookies,该值只能是true,否则不返回。如果上面的access-control-allow-origin设置的是* 而你又需要cookie信息,则 必须设置这行。``  ` `  ``add_header access-control-allow-methods ``'get, post, options'``;``  ` `  ``add_header access-control-allow-headers *;` `  ``if` `($request_method = ``'options'``) {``    ``return` `204;``  ``}``}  

上面的配置代码即可解决跨域问题了,不想深入研究的,看到这里就可以了=-=

解释

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类型的,都属于预检请求:

application``/x-www-form-urlencoded``multipart``/form-data``text``/plain

post请求中的content-type不是上面这三种的其中一种的话,都属于预检请求。(上面也有提到过,就是 复杂跨域的条件中的第②步)

所以 application/json的请求 会在正式通信之前,增加一次"预检"请求,这次"预检"请求会带上头部信息 access-control-request-headers: content-type:

options /api/test http/1.1``origin: https://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.

尾声

解决跨域的解决方案有很多种,最常见也是最传统的解决方式是使用jsonp的方式。cors与jsonp的使用目的相同,但是比jsonp更强大。

jsonp只支持get请求,cors支持所有类型的http请求。jsonp的优势在于支持老式浏览器,以及可以向不支持cors的网站请求数据。

到此这篇关于如何使用nginx解决跨域问题的文章就介绍到这了,更多相关nginx解决跨域内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多数据库技术:如何使用Nginx解决跨域问题详解,都可以关注数据库技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/dtteaching/1089894.html

(0)
上一篇 2022年5月7日
下一篇 2022年5月7日

精彩推荐