【发布时间】:2014-11-05 13:20:48
【问题描述】:
我们有一些公开共享的 S3 文件,我们希望确保它们不会被 Google 索引。我似乎找不到任何有关如何执行此操作的文档。有没有办法在单个 S3 对象上设置“noindex”x-robots-tag 响应标头?
(我们使用的是 Ruby AWS 客户端)
【问题讨论】:
标签: ruby amazon-s3 http-headers noindex
我们有一些公开共享的 S3 文件,我们希望确保它们不会被 Google 索引。我似乎找不到任何有关如何执行此操作的文档。有没有办法在单个 S3 对象上设置“noindex”x-robots-tag 响应标头?
(我们使用的是 Ruby AWS 客户端)
【问题讨论】:
标签: ruby amazon-s3 http-headers noindex
not 似乎是一种方法。
只有来自 S3 PUT 对象请求的某些标头被记录为在获取对象时返回。
http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html
您发送的任何其他内容似乎都被简单地忽略了,只要它实际上并未使请求无效。
其实,我在研究这个之前就是这么想的,而且几乎是真的。
documentation here 似乎不完整,elsewhere 建议以下请求标头,如果与上传一起发送,将出现在下载中:
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 对象返回相同的标头和值。
除非有人可以引用解释为什么这样做的文档,否则我们是在明显没有记录的领域开展业务的。
但是,如果您有兴趣去那里,简单的答案似乎是,您只需将此标头添加到您发送到 REST API 以上传对象的 HTTP PUT 请求中。
“没那么快,”你说,“我正在使用 Ruby SDK。”确实。 AWS Ruby 客户端似乎太“有帮助”,至少不会轻易让您摆脱这个问题。 docs there 展示了如何添加“元数据”--
: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 文件都是独立的。
【讨论】:
robots.txt 给出的结果与robots 标头不同。即使来自robots.txt:support.google.com/webmasters/answer/6062608?hl=en 的禁止链接,Google 仍会将链接编入索引。
@Michael - sqlbot 是正确的。 SDK 默认不支持它,它不会显示在 AWS 控制台中,但如果您直接使用 REST API 设置它,它就可以工作。对于那些不想弄清楚 REST API 及其身份验证方法的人,我可以修改 node.js aws-sdk 以支持此功能。
亚马逊将方法参数配置和验证存储在一个大型 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){});
【讨论】: