Перенаправление объектов Amazon S3
Можно ли разместить заголовок перенаправления на 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
Ответы
Ответ 1
В течение последнего месяца эта функциональность только что была добавлена.
Здесь вы можете найти документацию по API:
http://docs.amazonwebservices.com/AmazonS3/latest/dev/how-to-page-redirect.html
Когда вы устанавливаете свой объект, вам нужно установить ключ x-amz-website-redirect-location
на этот объект на перенаправление 301, которое вы хотите использовать.
Вы также можете использовать консоль.
![enter image description here]()
Ответ 2
В случае, если для ведра включен хостинг веб-сайтов, есть альтернативный способ добавить 301 перенаправление.
В соответствии с этим правила перенаправления описаны на уровне ковша в XML-формате и могут быть указаны в свойствах ведра через AWS S3 Console (раздел "Статический веб-хостинг" ).
В настоящее время полную документацию о ее синтаксисе можно найти здесь.
Этот подход удобен, когда у вас есть массовые перемещения 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
перенаправление.
Наконец, согласно документации,
если хостинг веб-сайтов отключен, поддержка перенаправления не применима для этого ведра.
Ответ 3
Недавно добавлена возможность: http://aws.typepad.com/aws/2012/10/amazon-s3-support-for-website-redirects.html
Ответ 4
Изменить: см. ответ выше, поскольку эта функциональность теперь является родной в 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>
Посмотрите на эту страницу здесь: быстро просмотрите источник.
view-source: http://carltonbale.com.s3.amazonaws.com/distance_chart.png
Здесь вы можете найти объяснение:
Пункт 8: http://carltonbale.com/9-hidden-features-of-amazon-s3
Ответ 5
htaccess 301 для переадресации Амазонки 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>
Вероятно, вы могли бы написать немного script по строкам:
// -----------------
// 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.
Ответ 6
AWSCLI позволяет вам сделать это легко сейчас (сорт)
- Убедитесь, что ведро на 100% общедоступно.
- Убедитесь, что ведро находится в режиме веб-хостинга
- Только ссылайтесь на сайт, используя его полный URL
https://<bucket_name>.s3-website-<region>.amazonaws.com
-
Используйте вызов s3api
, чтобы установить перенаправление
aws s3api put-object --acl public-read --website-redirect-location " http://other-location.com" --bucket foo- bucket --key где-то/blah
Примечание. Вы не отправляете объект на S3, потому что он будет обслуживать только 301 и перенаправить заголовок Location
.
Тестирование с помощью
curl -v 2 -L https://<bucket_name>.s3-website-<region>.amazonaws.com/somewhere/blah