Nginx配置跨域请求Access-Control-Allow-Origin *

  403年

当出现跨域错误的时候<代码>没有提供“Access-Control-Allow-Origin”的头所请求的资源>   

一、解决方案

  

只需要在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类型的帖子请求>   

 <代码>应用程序/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 *