GO:CORS-HTTP状态503-请求的资源上没有“ Access-Control-Allow-Origin”标头

时间:2019-04-18 08:13:48

标签: go cors

我有一个用Go语言编写的API和一个Angular中的Front语言。

当我ping通该网址时: https://myDomain/v1/users/sign/up Angular正在尝试发出 OPTIONS 请求。

我看到一些必须在API中设置cors的主题,这就是我所做的:

在我的main.go文件中:

servMuxApi := http.NewServeMux()
user.SetUserRoute(servMuxApi)

c := cors.SetupCors()
handler := c.Handler(servMuxApi)

if err := http.ListenAndServe(servPort, handler); err != nil {
    log.Fatal(err)
}

SetUserRoute函数中,我只有一个HandleFunc

router.HandleFunc("/v1/users/sign/up", SignUpUser)

SetupCors函数:

func SetupCors() *cors.Cors {
    return cors.New(cors.Options{
        AllowedOrigins:   []string{"http://localhost:8081*", "chrome-extension://coohjcphdfgbiolnekdpbcijmhambjff"},
        AllowedMethods:   []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete, http.MethodOptions},
        AllowCredentials: true,
        OptionsPassthrough: true,
        })
    }
}

NB:您看到的chrome扩展程序是我在Chrome上使用的Postman扩展程序。

使用所有这些设置后,当我尝试使用Angular front Sign Up表单时,Google Chrome控制台上仍然出现错误:

选项https://myDomain/v1/users/sign/up 503

从原点“ https://myDomain/v1/users/sign/up”到“ http://localhost:8081”的XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:否“访问控制” -Allow-Origin'标头出现在请求的资源上。

编辑:问题是,在Chrome控制台上,我看不到Respone enter image description here

2 个答案:

答案 0 :(得分:1)

我终于明白了这个问题。 我使用 CloudFlare https://www.cloudflare.com在服务器上设置一些安全性。 但是在CloudFlare上,“处于攻击模式” 变量被设置为“ ON” ->禁止对我的API的每个请求。 将其设置为关闭后,每个请求都会生效。因此,问题并非出自我的API或Front。 我的API设置得很好...

如果您使用反向代理服务器或某些防火墙,请非常小心您的配置,因为我们有很多冲突。

非常感谢 @Or Yaacov @ mh-cbon 为我提供帮助。 希望这个答案能帮助到别人。

答案 1 :(得分:0)

请添加以下允许的标头: (将通配符“ *”替换为您的应用数据标题)

AllowedHeaders:   []string{"Content-Type", "Origin", "Accept", "*"},

与Angular兼容的完整示例(我在以下内容中使用了大猩猩/多核):

//Start starting the http server
func Start() {
    router := NewRouter()
    headersOk := handlers.AllowedHeaders([]string{"Content-Type", "Origin", "Accept", "*"})
    originsOk := handlers.AllowedOrigins([]string{"*"})
    methodsOk := handlers.AllowedMethods([]string{"POST", "GET", "DELETE", "OPTIONS"})
    http.Handle("/api/", handlers.CORS(headersOk, originsOk, methodsOk)(http.StripPrefix("/api", router)))
    panic(http.ListenAndServe(":"+utils.Config.ServerPort, nil))
}

编辑: 您应确保您的响应包含我们为OPTIONS请求定义的所有“允许的标头”: enter image description here