golang http允许使用www和不使用某些域名

时间:2017-11-15 02:14:44

标签: 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)
}

这允许任何人都可以访问我的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")

那么,有没有办法让我获得请求来源?所以我可以动态地允许域名?我还有另一种方法可以解决这个问题吗?

2 个答案:

答案 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标头或类似标头。但是,如果您信任代理,则只检查(以及如何建立该信任是一个不同的问题)。