golang http 允许某些域名带 www 和不带 www

cam*_*car 0 http go cors

我正在写一个 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)
}
Run Code Online (Sandbox Code Playgroud)

这使得任何人都可以访问我的 api。我想将其限制为我的域名。因为这听起来更安全。我们称之为 www.example.com

我可以将其更改为

 w.Header().Set("Access-Control-Allow-Origin", "http://www.example.com")
Run Code Online (Sandbox Code Playgroud)

这将允许我在 url 为 www.example.com 但不是 example.com 时拨打电话

然后我可以将其更改为

w.Header().Set("Access-Control-Allow-Origin", "http://example.com")
Run Code Online (Sandbox Code Playgroud)

现在我可以从 example.com 访问我的 api,但不能从 www.example.com 访问我的 api

添加两者都不起作用 两种方式都行不通

w.Header().Set("Access-Control-Allow-Origin", "http://www.example.com,http://example.com")
Run Code Online (Sandbox Code Playgroud)

也不是这样

w.Header().Set("Access-Control-Allow-Origin", "http://www.example.com")
w.Header().Set("Access-Control-Allow-Origin", "http://example.com")
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法让我获得请求的来源呢?这样我就可以动态允许该域?我还有其他方法可以解决这个问题吗?

cam*_*car 6

我发现Origin信息在http.Request对象中。你可以通过以下方式获取原点

origin := r.Header.Get("Origin");
Run Code Online (Sandbox Code Playgroud)

假设你有一个像这样的物体

r *http.Request
Run Code Online (Sandbox Code Playgroud)

如果对象来自 example.com,它将返回 example.com,同样返回 www.example.com。然后,您可以测试它是否是这两个值之一作为身份验证的方式。