最近剛把 blog 搬到了 Amazon S3,前面用 CloudFront 擋,速度變快了不少。
不過遇到了一個忘記處理的問題:原本的網站會自動把文章網址從 / 轉到 /posts/,但是我忘記處理了,導致 Google Webmaster Tool 裡面噴一堆 404。
既然是 S3 轉址,我就回去看了之前的筆記,從 Webmaster Tool 把 404 列表下載回來之後,拼湊成轉址表,結果 S3 告訴我最多只能有 50 條規則,行不通了。
不過爬了一下文件才發現還有一個轉址規則是 ReplaceKeyPrefixWith
,簡單來說就是幫你 replace matched path prefix,官方的範例是你要把全站的網址從 /docs
搬到 /documents
那麼就是這樣設定:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>docs/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith>documents/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
</RoutingRules>
如此就有 301 轉址了。
但是要注意的是這個轉址是在 S3 設定的,所以如果前面有掛自訂 domain name 的 CDN 例如 CloudFront,那麼就要另外加上 HostName
設定才會跑到正確的網址。
所以我的 blog 是這樣設定的:
<?xml version="1.0"?>
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>2007/</KeyPrefixEquals>
</Condition>
<Redirect>
<HostName>blog.yorkxin.org</HostName>
<ReplaceKeyPrefixWith>posts/2007/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
<RoutingRule>
<Condition>
<KeyPrefixEquals>2008/</KeyPrefixEquals>
</Condition>
<Redirect>
<HostName>blog.yorkxin.org</HostName>
<ReplaceKeyPrefixWith>posts/2008/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
<RoutingRule>
<Condition>
<KeyPrefixEquals>2009/</KeyPrefixEquals>
</Condition>
<Redirect>
<HostName>blog.yorkxin.org</HostName>
<ReplaceKeyPrefixWith>posts/2009/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
<RoutingRule>
<Condition>
<KeyPrefixEquals>2010/</KeyPrefixEquals>
</Condition>
<Redirect>
<HostName>blog.yorkxin.org</HostName>
<ReplaceKeyPrefixWith>posts/2010/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
<RoutingRule>
<Condition>
<KeyPrefixEquals>2011/</KeyPrefixEquals>
</Condition>
<Redirect>
<HostName>blog.yorkxin.org</HostName>
<ReplaceKeyPrefixWith>posts/2011/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
<RoutingRule>
<Condition>
<KeyPrefixEquals>2012/</KeyPrefixEquals>
</Condition>
<Redirect>
<HostName>blog.yorkxin.org</HostName>
<ReplaceKeyPrefixWith>posts/2012/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
<RoutingRule>
<Condition>
<KeyPrefixEquals>2013/</KeyPrefixEquals>
</Condition>
<Redirect>
<HostName>blog.yorkxin.org</HostName>
<ReplaceKeyPrefixWith>posts/2013/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
<RoutingRule>
<Condition>
<KeyPrefixEquals>2014/</KeyPrefixEquals>
</Condition>
<Redirect>
<HostName>blog.yorkxin.org</HostName>
<ReplaceKeyPrefixWith>posts/2014/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
</RoutingRules>
btw 我有做一個搬家程式叫做 hikkoshi,可以處理泛 Jekyll 的 blog 搬家,以及 Ghost。如果你也有搬家的需求可以用用看。
參考: