当出现跨域错误的时候<代码>没有提供“Access-Control-Allow-Origin”的头所请求的资源> 代码,需要给Nginx服务器配置响应的头参数:
一、解决方案
只需要在Nginx的配置文件中配置以下参数:
<代码>位置/{ add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers“起源、X-Requested-With内容类型,接受”; add_header Access-Control-Allow-Methods“GET、POST、选项”; 代码}> >之前上面配置代码即可解决问题了,不想深入研究的,看到这里就可以啦=-=
引用>二、解释
1。<强> Access-Control-Allow-Origin 强>
服务器默认是不被允许跨域的。给Nginx服务器配置<代码> Access-Control-Allow-Origin * 代码>后,表示服务器可以接受所有的请求源(起源),即接受所有跨域的请求。
2。<强> Access-Control-Allow-Headers 强>是为了防止出现以下错误:
<代码>请求头字段内容类型是不允许Access-Control-Allow-Headers在起飞前的反应。代码>
这个错误表示当前请求- type的值不被支持。其实是我们发起了“应用程序/json"的类型请求导致的。这里涉及到一个概念:<代码>预检请求(起飞前的请求)> 代码,请看下面“预检请求“的介绍。
3。<强> Access-Control-Allow-Methods 强>是为了防止出现以下错误:
<代码>内容类型是不允许Access-Control-Allow-Headers在起飞前的反应。代码>
发送“预检请求“时,需要用到方法<代码>选项> 代码,所以服务器需要允许该方法。
三、预检请求(起飞前的请求)
其实上面的配置涉及到了一个W3C标准:<代码>横> 代码,全称是跨域资源共享(跨源资源共享),它的提出就是为了解决跨域请求的。
跨域资源共享(歌珥)标准新增了一组HTTP首部字段,允许服务器声明哪些源站有权限访问哪些资源。另外,规范要求,<强>对那些可能对服务器数据产生副作用的HTTP请求方法(特别是得到以外的HTTP请求,或者搭配某些MIME类型的帖子请求)>强,浏览器必须首先使用选项的方法发起一个预检请求(起飞前的请求),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的HTTP请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括饼干和HTTP认证相关数据)。
引用>其实<代码>内容类型字段的类型为application/json> 代码的请求就是上面所说的<代码>搭配某些MIME类型的帖子请求> 代码,歌珥规定,内容类型不属于以下MIME类型的,都属于预检请求:
<代码>应用程序/x-www-form-urlencoded 多部分/格式 文本/平原代码>所以application/json的请求会在正式通信之前,增加一次“预检“请求,这次“预检“请求会带上头部信息<代码> Access-Control-Request-Headers: - type> 代码:
<代码>选项/api/测试HTTP/1.1 来源:http://foo.example Access-Control-Request-Method:文章 Access-Control-Request-Headers:内容类型 …省略了一些代码>服务器回应时,返回的头部信息如果不包含<代码> Access-Control-Request-Headers: - type> 代码则表示不接受非默认的的内容类型。即出现以下错误:
<代码>请求头字段内容类型是不允许Access-Control-Allow-Headers在起飞前的反应。代码>
Nginx配置跨域请求Access-Control-Allow-Origin *