5

We have some publicly shared S3 files that we want to make sure won't be indexed by Google. I can't seem to find any documentation on how to do this. Is there a way to set a "noindex" x-robots-tag response header on individual S3 objects?

(We're using the Ruby AWS client)

4

2 回答 2

7

似乎没有办法做到这一点。

只有来自 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 文件都是独立的。

于 2014-09-11T22:46:15.823 回答
0

@Michael - sqlbot 是正确的。SDK 默认不支持它,它不会显示在 AWS 控制台中,但如果您直接使用 REST API 设置它,它就可以工作。对于那些不想弄清楚 REST API 及其身份验证方法的人,我可以修改 node.js aws-sdk 以支持此功能。

Amazon 将方法参数配置和验证存储在一个大型 json 文件中:apis/s3-2006-03-01.min.json。我猜其他 SDK 可能会以同样的方式实现它们的验证。

您可以转到“PutObject”命令,并在“input.members”下添加一个新参数“XRobotsTag”。将其配置为“标题”并将位置设置为“X-Robots-Tag”。

"XRobotsTag": {
  "location": "header",
  "locationName": "X-Robots-Tag"
}

您的本地 aws-sdk 现在已配置为支持您的 putObject 请求上的 X-Robots-Tag。在 node.js 中,这看起来像这样:

s3.putObject({
  ACL: "public-read",
  Body: "hello world",
  Bucket: "my-bucket",
  CacheControl: "public, max-age=31536000",
  ContentType: "text/plain",
  Key: "hello.txt",
  XRobotsTag: "noindex, nofollow"
}, function(err, resp){});
于 2019-08-19T21:25:25.600 回答