草庐IT

amazon-web-services - Go 代理到 S3 文件适用于本地主机但不适用于生产

coder 2024-07-07 原文

我在 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 下运行该应用程序时,它会起作用。所以 key 肯定是正确的。

这是我的 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)
}

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

最佳答案

我猜这是因为您只是传递传入的请求,结果应该是这样的:

curl -H "Host: spolytics.com" https://s3.amazonaws.com/...gif 

当你在你的 director 函数中更改主机头时,你应该把它变成:

curl -H "Host: s3.amazonaws.com" https://s3.amazonaws.com/...gif

director := func(request *http.Request) {
    request.Host = "s3.amazonaws.com"
    request.URL = parsedURL
}

关于amazon-web-services - Go 代理到 S3 文件适用于本地主机但不适用于生产,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49673493/

有关amazon-web-services - Go 代理到 S3 文件适用于本地主机但不适用于生产的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  5. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  6. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  7. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  8. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  9. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  10. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

随机推荐