「ng」Access-Control-Allow-Origin 跨域问题

【问题】

使用nginx作为代理服务器,nginx.conf配置文件中已添加

location / {
    proxy_pass http://127.0.0.1:88383;
    add_header Access-Control-Allow-Origin "*";
}

使用普通的post请求时,一切ok,但是post请求中的header增加了自定义的字段,就提示跨域问题。

【分析】

通过两次post的抓包发现正常的请求是post方式,而出问题的是OPTIONS方式,原来是头部信息中增加了自定义字段后,会通过发OPTIONS请求进行预检,而服务器并没有处理这个OPTIONS预检操作,所以失败,两种解决方案:

1、取消头部中自定义新字段,改为放到post的body中;

2、修改服务器(一般是nginx),增加OPTIONS的跨域支持,两个地方修改:1)服务增加path对应的OPTIONS操作,如下(示例为golang语言的gin框架):

if _, ok := optionsExists[path]; !ok { // 防止重复注册
optionsExists[path] = true
g.OPTIONS(path, func(c *gin.Context) { // 解决自定义头部信息引起的跨域问题
c.JSON(http.StatusOK, 0)
})
}

2)在nginx配置增加(比如token字段),参考如下配置:

location / {
            proxy_pass http://127.0.0.1:88383;
            add_header Access-Control-Allow-Origin "*";
            add_header Access-Control-Allow-Headers "Accept,Accept-Language,Content-Language, Last-Event-ID,Content-Type,Origin, X-Requested-With,token";
            add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
            add_header Access-Control-Expose-Headers "token";
            add_header Access-Control-Max-Age 1728000;
        }

posted on 2019-01-10 15:40  trako  阅读(875)  评论(0编辑  收藏  举报

导航