我有一个golang api我正在写作。我为cors使用以下函数
func ResponseWithJSON(w http.ResponseWriter, json []byte, code int) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("Access-Control-Allow-Origin", "*")
w.WriteHeader(code)
w.Write(json)
}
这允许任何人都可以访问我的api。我想将其限制为我的域名。因为这听起来更安全。我们称之为www.example.com
我可以将其更改为
w.Header().Set("Access-Control-Allow-Origin", "http://www.example.com")
当网址是www.example.com而不是example.com
时,这将允许我拨打电话然后我可以将其更改为
w.Header().Set("Access-Control-Allow-Origin", "http://example.com")
现在我可以从example.com访问我的api,但不能访问www.example.com
添加两者都不起作用 不是这样的
w.Header().Set("Access-Control-Allow-Origin", "http://www.example.com,http://example.com")
也不是这样
w.Header().Set("Access-Control-Allow-Origin", "http://www.example.com")
w.Header().Set("Access-Control-Allow-Origin", "http://example.com")
那么,有没有办法让我获得请求来源?所以我可以动态地允许域名?我还有另一种方法可以解决这个问题吗?
答案 0 :(得分:2)
我发现Origin信息在http.Request对象中。你可以用
获得原点origin := r.Header.Get("Origin");
假设你有一个像
这样的对象r *http.Request
如果对象来自example.com,它将返回example.com,同样是www.example.com。然后,您可以测试它是否是这两个值中的一个作为验证方式。
答案 1 :(得分:0)
Access-Control-Allow-Origin标头仅支持单个值,因此您必须检查主机请求标头,然后根据该标头做出决定:
package main
import "net/http"
func myHandler(w http.ResponseWriter, r *http.Request) {
switch host := r.Header.Get("Host"); host {
case "www.example.com", "example.com":
w.Header().Set("Access-Control-Allow-Origin", "http://"+host)
}
}
并非主机标头有时会被代理服务器更改。然后,他们通常会添加X-Forwarded-Host标头或类似标头。但是,如果您信任代理,则只检查(以及如何建立该信任是一个不同的问题)。