当前位置: 首页 > 科技观察

一篇了解Nginx如何配置跨域的文章,值得收藏

时间:2023-03-12 22:18:25 科技观察

当出现403跨域错误,No'Access-Control-Allow-Origin'headerispresentontherequestedresource,需要配置Nginx服务器的响应头参数,一起来看看吧!1、配置跨域,只需要在Nginx配置文件中配置如下参数:location/{add_headerAccess-Control-Allow-Origin*;add_headerAccess-Control-Allow-Methods'GET,POST,OPTIONS';add_headerAccess-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'){return204;}}上面的配置代码可以解决问题。二、参数说明1、Access-Control-Allow-Origin服务器默认不允许跨域。给Nginx服务器配置`Access-Control-Allow-Origin*`后,表示服务器可以接受所有的请求源(Origin),即接受所有的跨域请求。2.Access-Control-Allow-Headers是为了防止以下错误:RequestheaderfieldContent-TypeisnotallowedbyAccess-Control-Allow-Headersinpreflightresponse。这个错误表示不支持当前请求的Content-Type的值。其实是我们发起了“application/json”的类型请求导致的。这里涉及到一个概念:preflightrequest,请看下面“preflightrequest”的介绍。3.Access-Control-Allow-Methods是为了防止以下错误:Content-TypeisnotallowedbyAccess-Control-Allow-Headersinpreflightresponse。4.OPTIONS增加204返回,处理Nginx发送POST请求时仍然拒绝访问的错误当“preflightrequest”时,需要方法OPTIONS,所以服务端需要允许该方法。3、预检请求(preflightrequest)其实上面的配置涉及到一个W3C标准:CROS,全称是跨域资源共享(Cross-originresourcesharing),是为解决跨域请求而提出的。跨源资源共享(CORS)标准添加了一组新的HTTP标头字段,允许服务器声明哪些源站点有权访问哪些资源。另外,规范要求对于那些可能对服务器数据产生副作用的HTTP请求方式(尤其是GET以外的HTTP请求,或者某些MIME类型的POST请求),浏览器必须先使用OPTIONS方式发起preflight请求(preflightrequest),从而知道服务器是否允许跨域请求。服务器确认权限后,才发起实际的HTTP请求。在preflight请求的返回中,服务端还可以通知客户端是否携带身份凭证(包括Cookies和HTTP认证相关数据)。实际上,Content-Type字段为application/json的请求就是上述带有一定MIME类型的POST请求。CORS规定Content-Type不属于以下MIME类型,是pre-check请求:application/x-www-form-urlencodedmultipart/form-datatext/plain所以application/json请求会加一个“pre-check”正式沟通前的请求。这个“预检”请求会带上header信息Access-Control-Request-Headers:Content-Type:OPTIONS/api/testHTTP/1.1Origin:http://foo.exampleAccess-Control-Request-Method:POSTAccess-Control-Request-Headers:Content-Type...服务器响应时,返回的header如果内部信息中不包含Access-Control-Allow-Headers:Content-Type,则表示非默认的Content-Type公认。即出现如下错误:RequestheaderfieldContent-TypeisnotallowedbyAccess-Control-Allow-Headersinpreflightresponse。