Go代理到S3文件适用于localhost但不适用于生产

时间:2018-04-05 13:22:53

标签: amazon-web-services go amazon-s3

我在S3上有一些GIF。他们都是公开的。这是一个样本

https://s3.amazonaws.com/spolytics.com/moves/2bfc1ab0-5bda-4121-a3ea-b34c4fc01260/27e7b9d9-ff09-475f-885a-6b097a466174.gif

我想通过我的Go应用代理它们,以便用户始终看到我的自定义域而不是S3域。

https://spolytics.com/zemirco/matches/2bfc1ab0-5bda-4121-a3ea-b34c4fc01260/moves/27e7b9d9-ff09-475f-885a-6b097a466174.gif

格式只是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)
}

有什么想法吗?特别是为什么它在生产中不起作用?

1 个答案:

答案 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
}