Webサイトのリニューアル時にはリンク切れを起こさなようにリダイレクトをかけることがあります。
リダイレクトの手法は色々ありますが、CloudFrontで行うとき場合について説明します。
CloudFrontってなに?
CloudFrontは、グローバルなコンテンツデリバリーネットワーク(CDN)サービスでウェブサイトやアプリケーションの静的および
動的なコンテンツを高速で安定的に配信することができます。
CloudFrontは、世界中に分散したエッジロケーション(CDNエッジ)を使用してコンテンツを配信します。
これにより、ユーザーは最も近いエッジに接続されるため、高速で低レイテンシーのアクセスを実現できます。
また、CloudFrontは、コンテンツのキャッシュ、圧縮、最適化、およびセキュリティ機能を提供し、コンテンツの配信を最適化することができる。
CloudFrontでリダイレクトする仕組み
エッジロケーションでLambda関数が実行できるのでそれを利用してリダイレクトを行います。
Lambda関数が設置出来る場所は4箇所ありますが、リダイレクトを行う場合は①の箇所が適切です。
メリット・デメリット
CloudFrontで行うメリット
・大量のリダイレクト文でもレスポンス良く応答してくれると思う
・オリジンサーバーに転送されるトラフィックを減らすことができる
CloudFrontで行うデメリット
・独自のリダイレクト構文となるので設定が面倒
以下の内容をLambda関数に記述してリダイレクトを行うが、.htaccessのように●●●を○○○へリダイレクトするような書き方が出来ない
'use strict';
exports.handler = (event, context, callback) => {
// リダイレクト先のURLを定義する
const redirectURL = 'https://example.com/new-location';
// リダイレクトを実行する
const response = {
status: '301',
statusDescription: 'Moved Permanently',
headers: {
location: [{
key: 'Location',
value: redirectURL,
}],
},
};
callback(null, response);
};
CloudFrontで.htaccess構文でリダイレクトするには
.htaccessの構文を解析してリダイレクトするLambda関数をMITライセンスで展開してくれているのがあります。
https://github.com/marksteele/edge-rewrite
良いところ:
rules.jsonで.htaccessのような記述が可能。
サンプルもgithubにあがっていますが、以下のような書き方でリダイレクトが出来ます。
[
" ^/topsecret.*$ [F,L] " ,
" ^/oldpath/( \\ d*)/(.*)$ /newpath/$2/$1 [L] " ,
" !^/oldpath.*$ http://www.example.com [R=302,L,NC] " ,
" ^/deadlink.*$ [G] " ,
" ^/foo$ /bar [H=^baz.com$] "
]
感想
edge-rewriteモジュールを使用してみましたが、.htaccess上で1行で完結するようなリダイレクトは問題ないかなと思いました。ただ、以下のようにRewriteCondを使用してクエリーパラメータを参照するようなリダイレクトはedge-rewriteでは出来ません。
用途に合わせて利用して頂ければと思います。
RewriteCond %{QUERY_STRING} ^p=1$
RewriteRule ^test/$ https://lpeg.info/category [L,R=301]