• 注册
  • 运维随笔 运维随笔 关注:339 内容:5

    Nginx 解决跨域请求问题(附带多域名配置)

  • 查看作者
  • 打赏作者
    • 年SVIP2
      靓号:9999
      宇宙最帅

      问题前言

      当我们进行开发时,经常会遇到跨域问题,这种情况常见的话一般分为以下几种:

      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或者疑问欢迎各路大神补充&指正

      请登录之后再进行评论

      登录
    • 发布
    • 做任务
    • 实时动态
    • 偏好设置
    • 帖子间隔 侧栏位置: