问题前言
当我们进行开发时,经常会遇到跨域问题,这种情况常见的话一般分为以下几种:
1、后台无法开放访问域,当我们调用接口时就会被浏览器拦截。
2、前后端分离,前端资源与后台数据库处于不同的服务器中。
前后端分离的项目中,前端调用后台服务时,报错 “CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.”,你就是遇到了跨域问题。
跨域解决方案(Nginx)
这里我使用的解决方案是在 nginx 中添加允许跨域请求头
1、修改nginx的配置文件
server { location / { # 指定允许其他域名访问(*、指定域、动态设置) # 注:设置为“*”后请求不允许携带认证头和cookies add_header "Access-Control-Allow-Origin" "https://www.yaolou.com"; # 是否允许后续请求携带认证信息(cookies),该值只能是true,否则不返回 # 如果上面的 Access-Control-Allow-Origin 设置的是 * 而你又需要cookie信息,则必须设置这行。 #add_header "Access-Control-Allow-Credentials" "true"; # 预检结果缓存时间,也就是常说的缓存(指定本次预检请求的有效期,单位为秒,这里我设置的超时时间为48小时) add_header "Access-Control-Max-Age" "172800"; # 允许的请求类型(GET, PUT, POST, OPTIONS, HEAD, DELETE, TRACE, CONNECT) add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS"; # 允许的请求头字段(DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization) add_header "Access-Control-Allow-Headers" "Content-Type, Origin, Referer, User-Agent"; } }
2、如果需要配置成多域名该怎么写呢?
正确的 nginx 配置方式是先测试 http_origin 是否符合要求,如果符合,将用户传入的 http_origin 填入中
location / { if ($http_origin ~* "^https?://(yaolou.com|www.yaolou.com)$") { add_header "Access-Control-Allow-Origin" "$http_origin"; } }
3、注意事项
1. 避免将 Access-Control-Allow-Origin 设置为 null 和 *
2. 禁止直接反射HTTP请求头中的Origin字段值。对请求头Origin值做严格过滤、校验。具体来说,可以使用“全等于”判断,或使用严格的正则(如:^https://domain\.qq\.com$)进行判断。
4、跨域参数解释
Access-Control-Allow-Origin:服务器默认是不被允许跨域的。给Nginx服务器配置Access-Control-Allow-Origin *后,表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。
Access-Control-Allow-Methods:允许通过的方法,可以防止Content-Type is not allowed by Access-Control-Allow-Headers in preflight response的错误信息
Access-Control-Allow-Headers:为了防止出现Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response的错误信息。这个错误表示当前请求Content-Type的值不被支持。其实是我们发起了”application/json”的类型请求导致的。
使用提示
请根据自己实际情况做相应修改
如有什么BUG或者疑问欢迎各路大神补充&指正