似乎没有办法做到这一点。
只有来自 S3PUT
对象请求的某些标头被记录为在获取对象时返回。
http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html
您发送的任何其他内容似乎都被简单地忽略了,只要它实际上并未使请求无效。
实际上,这就是我在研究之前的想法,而且几乎是真的。
此处的文档似乎不完整,并且其他地方建议以下请求标头(如果与上传一起发送)将出现在下载中:
Cache-Control
Content-Disposition
Content-Encoding
Content-Type
x-amz-meta-*
后一个链接中列出了其他标头,但其中一些标头在请求中Expect
没有意义GET
,因此它们在逻辑上不会出现。
到目前为止,这一切都与我对 S3 的体验一致。
如果您在请求中发送随机但非无效的标头,它将被忽略。例子:
X-Foo: bar
S3 似乎在上传时接受了这个,但将其丢弃(大概不存储它)......下载对象不会返回X-Foo
标头。
但X-Robots-Tag
似乎是一个无证的例外。
使用(例如)上传文件X-Robots-Tag: noindex
确实会导致与对象返回相同的标头和值GET
。
除非有人可以引用解释其工作原理的文档,否则我们是在明显无证的领域开展业务的。
但是,如果您有兴趣去那里,简单的答案似乎是,您只需将此标头添加到PUT
您发送到 REST API 以上传对象的 HTTP 请求中。
“没那么快,”你说,“我正在使用 Ruby SDK。” 的确。AWS Ruby 客户端似乎太“有帮助”,至少不会轻易让您摆脱这个问题。那里的文档展示了如何添加“元数据”——
:metadata
(Hash) — 包含在对象中的元数据的散列。这些将作为带有 x-amz-meta 前缀的标头发送到 S3。每个名称、值对必须符合 US-ASCII。
好吧,那是行不通的,因为你会得到 x-amz-meta-x-robots-tag。
您如何在上传中设置其他标题?您通常设置的每个其他标头都是选项哈希的一个元素,例如,它在上传请求:cache_control
中变成。Cache-Control:
除非他们盲目地将来自该散列的密钥应用于上传事务(这将是糟糕的设计加上极好的运气),否则您可能没有直接的方法从那里到达这里。我不能说得更具体,因为我对 Ruby 的真正了解与我对 Java 的了解相同——就我所见,我不喜欢它。:)
但X-Robots-Tag
在某种程度上,似乎是 S3 支持的自定义标头,但没有明确记录该事实。至少,它被 REST API 接受。
如果上述情况失败,您可以在上传对象后手动将此标头添加到 S3 控制台中的元数据中。(注意,X-Foo: Bar
在 S3 控制台上也不起作用——它被默默地丢弃,没有错误——但X-Robots-Tag:
工作正常)。
当然,您也可以将公开可读的 robots.txt 文件(其中包含适当的指令)放在存储桶的根目录中。根据您的组合、路径层次结构和其他因素,这(可能)不像选择性地设置标头那么简单,但是如果整个存储桶包含您不希望索引的信息,它应该可以轻松完成您想要的,因为如果 robots.txt 中不允许的内容不应被编入索引,即使搜索蜘蛛从另一个站点跟踪指向它的链接 - 每个域(和子域)的 robots.txt 文件都是独立的。