nginx解决跨域

天大地大妈咪最大 提交于 2020-01-27 08:24:02

什么是跨域?

使用js获取数据时,涉及到两个URL只要协议,域名,端口有任何一个不同,都被视为是不同的域,相互访问就会有跨域问题。

什么是CORS

CORS是一个W3C标准,全称是跨域资源共享(跨域资源共享)。它允许浏览器向跨源服务器发送XMLHttpRequest请求,从而克服了AJAX仅同源使用的限制。

当前几乎所有的浏览器(Internet Explorer 8 +,Firefox 3.5 +,Safari 4+和Chrome 3+)都可通过称为跨域资源共享(跨源资源共享)的协议支持AJAX跨域调用。

Chrome,Firefox,Opera,Safari都使用的是XMLHttpRequest2对象,IE使用XDomainRequest。

简单来说就是跨域的目标服务器要返回相应的标头,通过这些标头来控制是否同意跨域。跨域资源共享(CORS)也是未来的跨域问题的标准解决方案。

跨域解决方案

当出现403跨域错误的时候 No ‘Access-Control-Allow-Origin’ header is present on the requested resource,需要给Nginx服务器配置响应的header参数:

只需要在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;
    }
} 

解释

  1. Access-Control-Allow-Origin
    服务器默认是不被允许跨域的。给Nginx服务器配置Access-Control-Allow-Origin *后,表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。
  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),请看下面"预检请求"的介绍。

  1. Access-Control-Allow-Methods 是为了防止出现以下错误:
    Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!