Настройка noindex для объектов Amazon S3

У нас есть несколько общедоступных файлов S3, которые мы хотим, чтобы Google не проиндексировал. Я не могу найти документацию о том, как это сделать. Есть ли способ установить заголовок ответа x-robots-tag "noindex" для отдельных объектов S3?

(Мы используем клиент Ruby AWS)

1 ответ

Решение

Кажется, нет способа сделать это.

Только определенные заголовки из 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, кажется, принимает это при загрузке, но отбрасывает его (предположительно, не сохраняет его)... загрузка объекта не возвращает X-Foo заголовок.

Но X-Robots-Tag представляется недокументированным исключением из этого.

Загрузка файла с X-Robots-Tag: noindex (например) действительно приводит к тому же заголовку и значению, возвращаемому с объектом, когда вы GET Это.

Если кто-то не может ссылаться на документацию, объясняющую, почему это работает, мы работаем на недокументированной территории.

Но, если вы заинтересованы в этом, простой ответ выглядит так: вы просто добавляете этот заголовок в HTTP PUT запрос вы отправляете в REST API для загрузки объекта.

"Не так быстро, - говорите вы, - я использую Ruby SDK". В самом деле. Клиент AWS Ruby кажется слишком "полезным", чтобы позволить вам, по крайней мере, нелегко с этим покончить. Документы показывают, как добавить "метаданные" -

:metadata (Hash) - Хэш метаданных, которые будут включены в объект. Они будут отправлены на S3 в качестве заголовков с префиксом x-amz-meta. Каждое имя, пара значений должны соответствовать 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 каждого домена (и субдомена) стоит отдельно.

@Michael - sqlbot правильный. Пакеты SDK не поддерживают его по умолчанию, и он не отображается в консоли AWS, но если вы установите его напрямую с помощью REST API, он будет работать. Для тех, кто не хочет разбираться в REST API и его методе аутентификации, я смог изменить aws-sdk node.js для поддержки этой функции.

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 теперь настроен для поддержки X-Robots-Tag в ваших запросах putObject. В 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){});
Другие вопросы по тегам