mod_rewriteを使ってAmazon S3のコンテンツを表示させる

自分で立てたWebサーバから静的コンテンツ(index.html等)を配信していた形を、元々のWebサーバのURLは変えずに、Amazon S3から配信させてみます。(事前にAmazon S3の該当バケットにindex.html等のコンテンツをアップしておきます。)

今回は、Amazon LinuxApache HTTP Serverで試しました。

まずは、Apacheをインストール、起動します。

sudo yum install -y httpd
sudo service httpd start

適当なindex.htmlファイルを/var/www/html以下に作成します。

動作するサーバにアクセスすると

curl http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
(自分で立てたサーバ上のコンテンツが表示)

次に、/etc/httpd/conf/httpd.confの中身を見て、mod_rewriteがロードされていることを確認します。

LoadModule rewrite_module modules/mod_rewrite.so

続けて、/etc/httpd/conf/httpd.confの中に以下を追記します。

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
    RewriteEngine On
    RewriteRule ^/(.*)$ http://xxxxx.s3-website-ap-northeast-1.amazonaws.com/$1 [P,L]
</VirtualHost>

※上記例では、S3のWebサイトホスティングのURLに直接変更させています。

その後、Apacheを再起動して

sudo service httpd restart

同様にアクセスする。

curl http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
(xxxxx.s3-website-ap-northeast-1.amazonaws.com/index.htmlの内容が表示される)

httpd.confのRewriteRuleで末尾の[P,L]にしておくと、URLはec2-xx-xx-xxx-xxx...のままで、S3の画像を表示させます。末尾を[R,L]にすると、S3のURLにリダイレクトされました。

リダイレクト先のドメイン名は元々のS3のものを使っていますが、これをRoute 53等のDNSでカスタムドメインを登録して、カスタムドメインでS3へアクセスさせることも勿論できます。

この方法を使えば、アプリ側を特に修正を入れずに、URLにマッチした場合にS3の画像を表示させることができそうですね!(勿論rewriteさせる形ではなく、アプリ側を修正させる方が望ましいですけども。)