代码之家  ›  专栏  ›  技术社区  ›  Yarin

在Amazon S3对象上设置noindex

  •  5
  • Yarin  · 技术社区  · 10 年前

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

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

    2 回复  |  直到 10 年前
        1
  •  8
  •   Michael - sqlbot    10 年前

    确实如此 似乎是这样做的一种方式。

    仅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 (例如)确实会导致对象返回相同的头和值 获取

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

    但是,如果您有兴趣去那里,简单的答案似乎是,您只需将此标头添加到HTTP 看跌,看跌 请求发送到REST API以上载对象。

    “没那么快,”你说,“我正在使用RubySDK。”确实如此。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标签 在某种程度上,S3似乎支持自定义标头,但没有明确的文档说明这一事实。它至少被REST API所接受。

    如果未能完成上述操作,您可以在上传对象后手动将此标头添加到S3控制台中的元数据中。(注意, X-Foo: Bar 在S3控制台上也不起作用——它被默默丢弃,没有任何错误——但是 X-Robots-Tag: 工作正常)。


    当然,您也可以在bucket的根目录中放置一个公开可读的robots.txt文件(其中包含适当的指令)。根据您的共同内容组合、路径层次结构和其他因素,这可能不像有选择地设置标题那么简单,但如果整个存储桶包含您不希望索引的信息,那么它应该很容易完成您想要的内容,因为如果robots.txt中不允许,则不应该对内容进行索引,即使当搜索蜘蛛从另一个站点跟踪到它的链接时,每个域(和子域)的robots.txt文件都是独立的。

        2
  •  0
  •   bryantwilliams    5 年前

    @Michael-sqlbot是正确的。默认情况下,SDK不支持它,并且它不会显示在AWS控制台中,但如果您直接使用REST API设置它,它会起作用。对于那些不想弄清楚RESTAPI及其身份验证方法的人,我可以修改node.jsaws-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){});