我在S3上有一些GIF。他们都是公开的。这是一个样本
我想通过我的Go应用代理它们,以便用户始终看到我的自定义域而不是S3域。
格式只是spolytics.com/{username}/matches/{uuid}/moves/{uuid}.gif
。但是,正如您在单击第二个链接时看到的那样,它无法按预期工作。我收到了错误
<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>
spolytics.com/moves/2bfc1ab0-5bda-4121-a3ea-b34c4fc01260/27e7b9d9-ff09-475f-885a-6b097a466174.gif
</Key>
<RequestId>04A5AD2E108B3B78</RequestId>
<HostId>oNgfLfa4vl3Lb/TWrqgFlGDIXRr2bL6bduhSLKKQF+5w5H82GpnXnXrW3oWY4tVKsnYmiUvx7fI=</HostId>
</Error>
当我在localhost
下的本地计算机上运行应用程序时,它可以正常工作。所以钥匙绝对是正确的。
这是我的Go代理
func(w http.ResponseWriter, r *http.Request) {
uuid := "..."
id := "..."
rawURL := fmt.Sprintf("https://s3.amazonaws.com/spolytics.com/moves/%s/%s.gif", uuid, id)
parsedURL, err := url.Parse(rawURL)
if err != nil {
...
}
director := func(request *http.Request) {
request.URL = parsedURL
}
proxy := &httputil.ReverseProxy{
Director: director,
}
proxy.ServeHTTP(w, r)
}
有什么想法吗?特别是为什么它在生产中不起作用?
答案 0 :(得分:1)
我猜这是因为你只是传递了你的传入请求,这应该会产生类似的结果:
curl -H "Host: spolytics.com" https://s3.amazonaws.com/...gif
当您更改导演功能中的主机标题时,您应将其转换为:
curl -H "Host: s3.amazonaws.com" https://s3.amazonaws.com/...gif
director := func(request *http.Request) {
request.Host = "s3.amazonaws.com"
request.URL = parsedURL
}