Amazon S3对象redirect
是否有可能把redirect头在s3对象上? 像301redirect一样。
例如:
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
在上个月内,这个function刚添加完毕。
你可以在这里findAPI文档:
http://docs.amazonwebservices.com/AmazonS3/latest/dev/how-to-page-redirect.html
当你把你的对象,你需要设置对该对象的x-amz-website-redirect-location
键到你想要使用的301redirect。
您也可以使用控制台。
如果为存储桶启用了网站托pipe,则可以添加301redirect。 根据它,redirect规则以XML格式在存储桶级别进行描述,并且可以通过AWS S3控制台(“静态网站托pipe”部分)在存储桶的属性中指定。 有关其语法的完整文档可以在这里find。
只要在一个地方pipe理所有的redirect,就可以使用这种方法。 例如,可以定义redirect规则
<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>
它看起来就像创build假对象并为它们指定x-amz-website-redirect-location元数据一样。 坏消息是一个存储桶中XML的数量不能超过50个。 是的,pipe理XML是不方便的。 但是对我来说,这种方式目前比较容易。 同样,因为在一个地方pipe理所有文件比较容易。
这个XML方法在你重新命名一个拥有大量页面的目录时是非常有用的。 在这种情况下,有必要为目录创build单个redirect规则,而不是为其中的每个页面单独规则。 例如
<RoutingRule> <Condition> <KeyPrefixEquals>blog/</KeyPrefixEquals> </Condition> <Redirect> <ReplaceKeyPrefixWith>it-blog/</ReplaceKeyPrefixWith> </Redirect> </RoutingRule>
根据这个规则example.com/blog/whatever
会被redirect到example.com/it-blog/whatever
。
这种方法的另一个有用的function是它只replace前缀。 和目录一样,可以redirect页面,但保存查询参数。 如果这些查询参数有一些JS处理,这可能是合适的。 有了x-amz-website-redirect-location元数据,你可能会失去它们。
正如我所提到的,读取XML可能不方便。 为了解决这个问题,我在GWT中写了一个简单的在线工具 ,将纯文本与原来的和新的URL转换为XML格式。 它使用KeyPrefixEquals
谓词并执行ReplaceKeyPrefixWith
redirect。
最后,根据文档 ,如果网站托pipe被禁用,redirect支持不适用于这个桶。
最近添加的function: http : //aws.typepad.com/aws/2012/10/amazon-s3-support-for-website-redirects.html
编辑:请参阅上面的答案,因为此function现在在AWS中是原生的
不是真的没有。 没有一个内置的function,但是,你可以做的是创build你的对象,即使你不把它保存为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
htaccess 301到Amazon S3redirect转换
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"));
警告:亚马逊限制redirect规则的数量为50。
AWSCLI可以让你轻松地做到这一点(有点)
- 确保水桶是100%公开的
- 确保存储区处于网站托pipe模式
- 只能使用完整url
https://<bucket_name>.s3-website-<region>.amazonaws.com
-
使用
s3api
调用来设置redirectaws s3api put-object –acl public-read –website-redirect-location“ http://other-location.com ”–bucket foo-bucket –key somewhere / blah
注意 :您不会将任何对象发布到S3,因为它只会提供301和redirectLocation
标题。
用testing
curl -v 2 -L https://<bucket_name>.s3-website-<region>.amazonaws.com/somewhere/blah