什么是跨域?
使用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;
}
}
解释
- Access-Control-Allow-Origin
服务器默认是不被允许跨域的。给Nginx服务器配置Access-Control-Allow-Origin *
后,表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。 - 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),请看下面"预检请求"的介绍。
- Access-Control-Allow-Methods 是为了防止出现以下错误:
Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
4.给OPTIONS 添加 204的返回,是为了处理在发送POST请求时Nginx依然拒绝访问的错误
发送"预检请求"时,需要用到方法 OPTIONS ,所以服务器需要允许该方法。
来源:CSDN
作者:Rio520
链接:https://blog.csdn.net/Rio520/article/details/103819356