はじめに
ウェブサイトの移設等でドメインを変更する機会はよくあると思います。その際、いきなり旧ドメイン削除せず新ドメインにリダイレクトしたりしますよね?設定方法はいくつか考えられると思いますが、今回は AWS ELB リスナールールを活用したリダイレクト設定方法を紹介します。
構成イメージ
リダイレクト設定前
リダイレクト設定後
やりたいこと
現ドメイン リダイレクト先ドメイン AAAAA.example.com BBBBB.example.com
- https://AAAAA.example.com/backup/xxxxx へアクセスした場合 https://BBBBB.example.com/new/backup/xxxxx へリダイレクト
- 上記以外の https://AAAAA.example.com/ へアクセスした場合 https://BBBBB.example.com/ へリダイレクト
もう少し細かく説明すると
1は
パスが「/backup/」まで指定されたアクセスの場合
リダイレクトする際に「/new/」パスをドメインの後ろに追加し
既存パス「/backup/xxxxx/」は「/new/」パスの後に継承する設定
例えばこのようなリダイレクトです
https://AAAAA.example.com/backup/xxxxx ⇒ https://BBBBB.example.com/new/backup/xxxxx
2は
パスが「/backup/」以外でアクセスの場合
パスがそのまま継承されリダイレクトする設定
例えばこのようなリダイレクトです
https://AAAAA.example.com/ ⇒ https://BBBBB.example.com/
https://AAAAA.example.com/xxxxx ⇒ https://BBBBB.example.com/xxxxx
ELB 設定・・・今回は ELB 作成は省略し、リスナールール設定のみ紹介します
[サービス > EC2 > ロードバランサー > 対象 LB > リスナー > ルール]
[ルールの表示/編集] を押下
現状は ELB ターゲットグループに EC2 がぶら下がってる状態です。
次の手順でリダイレクト設定に変更していきます。
まずは、前述のパターン1のリダイレクト設定を追加します。
[ルールの追加] - [ルールの挿入] を押下し
下記設定を追加し [保存] を押下
設定項目 設定値 IF パス=/backup/* THEN リダイレクト先 プロトコル HTTPS ポート #{port} カスタムホスト、パス、クエリを使用 ホスト BBBBB.example.com パス /new/#{path} クエリ #{query} ステータスコード 301 - 完全に移動されました
この際「パス=/backup/*」とすることで「/backup/」以降のパスがある場合でもリダイレクトしてくれます。
もし「*」無しで「パス=/backup/」で設定すると「https://AAAAA.example.com/backup/xxxxx」のように「/backup/」以降にパスがあるアクセスの際リダイレクト対応されません。
筆者はここで地味につまずきました。。。
続いて、パターン2のリダイレクト設定を追加します。
今回は既存ルールがあるので既存ルールを削除してからリダイレクト設定を追加します。
[ルールの編集] - [HTTPS 443: デフォルトアクション] - [ルールの編集]
[THEN 1.転送先 ] を削除
[アクションの追加] - [リダイレクト先] を選択し
下記設定を追加し [更新] を押下
設定項目 設定値 THEN リダイレクト先 プロトコル HTTPS ポート #{port} カスタムホスト、パス、クエリを使用 ホスト BBBBB.example.com パス /#{path} クエリ #{query} ステータスコード 301 - 完全に移動されました
設定はこれで完了です。
リダイレクト確認
設定は完了したので、設定どおりにリダイレクトするか確認してみましょう。
まずはパターン1
$ curl -I https://AAAAA.example.com/backup/xxxxx HTTP/1.1 301 Moved Permanently Server: awselb/2.0 Date: Thu, 31 Mar 2022 02:09:10 GMT Content-Type: text/html Content-Length: 134 Connection: keep-alive Location: https://BBBBB.example.com:443/new/backup/xxxxx
想定通り、「/new/」パスが追加され「BBBBB.example.com」ドメインへリダイレクトされました。
https://AAAAA.example.com/backup/xxxxx ⇒ https://BBBBB.example.com:443/new/backup/xxxxx
続いてパターン2
$ curl -I https://AAAAA.example.com/ HTTP/1.1 301 Moved Permanently Server: awselb/2.0 Date: Thu, 31 Mar 2022 02:09:03 GMT Content-Type: text/html Content-Length: 134 Connection: keep-alive Location: https://BBBBB.example.com:443/ $ curl -I https://AAAAA.example.com/xxxxx HTTP/1.1 301 Moved Permanently Server: awselb/2.0 Date: Thu, 31 Mar 2022 02:09:23 GMT Content-Type: text/html Content-Length: 134 Connection: keep-alive Location: https://BBBBB.example.com:443/xxxxx
こちらも想定通り、「/backup/」パス以外でのアクセスなのでパスは継承され「BBBBB.example.com」ドメインへリダイレクトされました。
https://AAAAA.example.com/ ⇒ https://BBBBB.example.com:443/
https://AAAAA.example.com/xxxxx ⇒ https://BBBBB.example.com:443/xxxxx
最後に
この仕組みを実装すれば EC2 内の apache/nginx 等でリダイレクト設定をする必要がなくなるので不要となる EC2 を削除することが出来、コスト的にもかなりお得になると思います。
そもそも使っていた ELB の設定をちょろっと変更するだけなので、新規で何か構築したり DNS 設定変更する手間も省けるので、サクッとリダイレクトしたい方にはお勧めの設定かと思います。
しかしながら、ELB もリダイレクトさせてるだけでそこそこコストはかかります。別の方法として CloudFront+S3 の組み合わせでも同じようにリダイレクトすることが可能なので、またの機会に書こうと思います。