【发布时间】:2018-04-28 03:23:09
【问题描述】:
我正在编写一个 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")
这将允许我在 url 是 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")
那么,有没有办法让我获得请求的来源?所以我可以动态地允许域?我还有其他方法可以解决这个问题吗?
【问题讨论】:
-
检查请求
host标头并提供相应的响应。 -
我该怎么做?你有例子吗?
-
FWIW,多次设置相同的标头不适用于
Header.Set(),因为它会替换任何以前设置的值。而是使用Header.Add()。 -
显然“逗号分隔和空格分隔的域都不起作用。匹配域列表并将单个主机放在标头中仍然具有更好的安全性并且可以正常工作。所以回到@zerkms cmets。见here