在AmazonS3对象上设置noindex



我们有一些公开共享的S3文件,我们希望确保这些文件不会被谷歌索引。我似乎找不到任何关于如何做到这一点的文档。有没有办法在单个S3对象上设置"noindex"x-robots-tag响应标头?

(我们使用的是Ruby AWS客户端)

似乎有一种方法可以做到这一点。

只有来自S3 PUT对象请求的某些标头被记录为在获取对象时返回。

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似乎在上传时接受了它,但放弃了它(可能不存储它)。。。下载该对象不返回CCD_ 4报头。

X-Robots-Tag似乎是一个未记录的例外

上传带有X-Robots-Tag: noindex的文件(例如)确实会导致在GET时与对象返回相同的头和值

除非有人能引用文件来解释为什么这是有效的,否则我们在明显没有证件的地区开展业务。

但是,如果您有兴趣去那里,那么简单的答案似乎是,您只需将此头添加到发送到RESTneneneba API的HTTPPUT请求中,即可上载对象。

"没那么快,"你说,"我在用Ruby SDK。"的确如此。AWS Ruby客户端似乎太"有用"了,至少不容易让你逃脱惩罚。那里的文档展示了如何添加"元数据"——

:metadata(哈希)——要包含在对象中的元数据的哈希。这些将作为前缀为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文件(其中包含适当的指令)放在bucket的根目录中。根据你的cobtent组合、路径层次结构和其他因素,这(也许)不像选择性地设置标题那么简单,但如果整个bucket都由你不想索引的信息组成,它应该很容易实现你想要的,因为如果robots.txt中不允许,就不应该对内容进行索引,即使搜索蜘蛛从另一个网站跟随链接,每个域(和子域)的robots.txt文件都是独立的。

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

Amazon将方法params配置和验证存储在一个大的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){});

最新更新