Перенаправление объекта Amazon S3
-
20-09-2019 - |
Вопрос
Можно ли поместить заголовок перенаправления на s3-объект?Как перенаправление 301.
Например:
mybucket.amazon-aws.com/myobject --> example.com/test
Предпочтительно, установив для объекта такой заголовок, как этот:
HTTP/1.1 301 Moved Permanently
Location: http://example.com/test
Content-Type: text/html
Content-Length: 0
Решение
В течение последнего месяца эта функциональность была только что добавлена.
Вы можете найти документацию по API здесь:
http://docs.amazonwebservices.com/AmazonS3/latest/dev/how-to-page-redirect.html
Когда вы РАЗМЕЩАЕТЕ свой объект, вам нужно установить x-amz-website-redirect-location
сопоставьте этот объект с перенаправлением 301, которое вы хотите использовать.
Вы также можете воспользоваться консолью.
Другие советы
В случае, если хостинг веб-сайта включен для корзины, есть альтернативный способ добавить 301 редирект.В соответствии с этим правила перенаправления описаны на уровне корзины в формате XML и могут быть указаны в свойствах корзины через консоль AWS S3 (раздел статического размещения веб-сайта).Полную документацию о его синтаксисе в настоящее время можно найти здесь.
Такой подход удобен при массовом перемещении URL-адресов, поскольку так проще управлять всеми перенаправлениями в одном месте.Например, можно определить правила перенаправления
<RoutingRule>
<Condition>
<KeyPrefixEquals>index.php</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyWith>index.html</ReplaceKeyWith>
</Redirect>
</RoutingRule>
<RoutingRule>
<Condition>
<KeyPrefixEquals>blog.php?id=21</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyWith>mysql-utf-8-database-creation-snippet.html</ReplaceKeyWith>
</Redirect>
</RoutingRule>
Похоже, это то же самое, что создавать поддельные объекты и указывать для них метаданные x-amz-website-redirect-location.Плохая новость заключается в том, что в XML может быть не более 50 таких правил для одного сегмента.И да, управлять XML не очень удобно.Но в настоящее время для меня этот путь проще.Опять же, потому что так проще управлять всеми файлами в одном месте.
Этот XML-подход чрезвычайно полезен, когда вы, скажем, переименовали каталог с большим количеством страниц.В этом случае необходимо создать единое правило перенаправления для каталога, вместо отдельного правила для каждой страницы внутри него.Например
<RoutingRule>
<Condition>
<KeyPrefixEquals>blog/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith>it-blog/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
В соответствии с этим правилом example.com/blog/whatever
будет перенаправлен на example.com/it-blog/whatever
.
Другой полезной особенностью такого подхода является то, что он заменяет только префиксы.Точно так же, как с каталогами, это возможно перенаправить страницу, но сохранить параметры запроса.Это могло бы подойти, если бы существовала некоторая обработка этих запросов в JS параметры.С метаданными x-amz-website-redirect-location вы, вероятно, потеряете их.
Как я уже упоминал, написание и чтение XML может быть неудобным.Чтобы преодолеть это, я написал простой онлайн-инструмент в GWT для
преобразуйте обычный текст с прежними и новыми URL-адресами в формат XML.Он использует
KeyPrefixEquals
предикат и выполнение ReplaceKeyPrefixWith
перенаправление.
Наконец, согласно Документация, если хостинг веб-сайта отключен, поддержка перенаправления неприменима для этого сегмента.
Эта возможность была добавлена недавно: http://aws.typepad.com/aws/2012/10/amazon-s3-support-for-website-redirects.html
Редактировать:Смотрите ответ выше, поскольку эта функциональность теперь является встроенной в AWS
Не совсем "нет".Встроенной функции, которая позволяла бы это, не существует, однако все, что вы можете сделать, это создать свой объект, и даже если вы не сохраните его как HTML, вы можете применить его как HTML-файл.
Например:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Refresh" content="0; URL=http://www.example.com/target/">
<title>Redirect</title>
</head>
<body>
<a href="http://www.example.com/target/">http://www.example.com/target/</a>
</body>
</html>
Посмотрите на эту страницу здесь:Быстро просмотрите источник на нем.
просмотр-источник:http://carltonbale.com.s3.amazonaws.com/distance_chart.png
Вы можете увидеть объяснение здесь:
Пункт 8: http://carltonbale.com/9-hidden-features-of-amazon-s3
перенаправление htaccess 301 на Amazon S3 перевод
стиль htaccess:
Redirect 301 /old/old.html http://www.new.com/new/new.html
переводится как:
<RoutingRule>
<Condition>
<KeyPrefixEquals>old/old.html</KeyPrefixEquals>
</Condition>
<Redirect>
<HostName>www.new.com</HostName>
<Protocol>http</Protocol>
<HttpRedirectCode>301</HttpRedirectCode>
<ReplaceKeyWith>new/new.html</ReplaceKeyWith>
</Redirect>
</RoutingRule>
Вероятно, вы могли бы написать небольшой сценарий примерно в:
// -----------------
// Javascript
// htaccess to amazon s3 redirect for static s3 websites.
// (XML goes into S3 Bucket Properties Editor > [x] Enable website hosting > Edit Redirection Rules box.)
// -----------------
var list = [
"Redirect 301 /old/old-1.html http://www.new.com/new/new-1.html",
"Redirect 301 /old/old-2.html http://www.new.com/new/new-2.html",
"Redirect 301 /old/old-3.html http://www.new.com/new/new-3.html"
];
var output = [];
output.push('<?xml version="1.0"?>');
output.push('<RoutingRules>');
for(var i=0; i<list.length; i++){
var item = list[i].replace("Redirect 301 /", "").split(" ");
var oldLoc = item[0];
var newLoc = item[1];
output.push(" <RoutingRule>");
output.push(" <Condition>");
output.push(" <KeyPrefixEquals>" + oldLoc + "/KeyPrefixEquals>");
output.push(" </Condition>");
output.push(" <Redirect>");
if(newLoc.substr(0, 1) == "/"){
output.push(" <ReplaceKeyWith>" + newLoc + "</ReplaceKeyWith>");
} else {
var splitNewLoc = newLoc.replace("http://", "").split("/");
var host = splitNewLoc.shift();
var path = splitNewLoc.join("/");
output.push(" <HostName>" + host + "</HostName>");
output.push(" <Protocol>http</Protocol>");
output.push(" <HttpRedirectCode>301</HttpRedirectCode>");
if(path){
output.push(" <ReplaceKeyWith>" + path + "</ReplaceKeyWith>");
}
}
output.push(" </Redirect>");
output.push(" </RoutingRule>");
}
output.push('</RoutingRules>');
print(output.join("\n"));
ПРЕДУПРЕЖДЕНИЕ:Amazon ограничивает количество правил перенаправления до 50.
AWSCLI ( АВСКЛИ ) позволяет вам сделать это легко сейчас (вроде как)
- Убедитесь, что ведро на 100% общедоступно
- Убедитесь, что bucket находится в режиме хостинга веб-сайта
- Ссылайтесь на сайт только по его полному URL
https://<bucket_name>.s3-website-<region>.amazonaws.com
Используйте
s3api
вызовите, чтобы установить перенаправлениеaws s3api поместить-объект --acl общедоступный-для чтения --веб-сайт-перенаправление-местоположение "http://other-location.com" -ведро фу-ведро -ключ где-нибудь /бла
Примечание:Вы не отправляете какой-либо объект в S3, потому что он будет обслуживать только 301 и перенаправлять Location
заголовок.
Тест с
curl -v 2 -L https://<bucket_name>.s3-website-<region>.amazonaws.com/somewhere/blah