【问题标题】:Setting noindex on Amazon S3 objects在 Amazon S3 对象上设置 noindex
【发布时间】:2014-11-05 13:20:48
【问题描述】:

我们有一些公开共享的 S3 文件,我们希望确保它们不会被 Google 索引。我似乎找不到任何有关如何执行此操作的文档。有没有办法在单个 S3 对象上设置“noindex”x-robots-tag 响应标头?

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

【问题讨论】:

    标签: ruby amazon-s3 http-headers noindex


    【解决方案1】:

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

    【讨论】:

    • 谢谢,虽然似乎必须有 some 方式 - Bucket ExplorerCloudberry 如何做到这一点?
    • 起初,我以为他们没有,但看到上面的大量编辑...... REST API 莫名其妙地接受了这个标头,据我所知没有记录。
    • Bravo-您的回答超出了预期,我非常感谢您的努力!
    • robots.txt 给出的结果与robots 标头不同。即使来自robots.txt:support.google.com/webmasters/answer/6062608?hl=en 的禁止链接,Google 仍会将链接编入索引。
    【解决方案2】:

    @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){});
    

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      相关资源
      最近更新 更多