@kotyのブログ

PythonとかAWSとか勉強会のこととかを、田舎者SEがつづります。記事のライセンスは"CC BY"でお願いします。

CloudFront+ALB+nginxで静的ファイルをserve という構成におけるtrailing slashのリダイレクト問題

メモ書き。

構成としてはタイトルの通り、CloudFront + ALB + EC2 + nginx。そしてnginxで静的ファイルをクライアントに返す、という構成。

このとき、 /hoge というリクエストに対し、 /hoge/index.html を返したい場合、 nginx はいったん 301 を返して、 クライアントを/hoge/ にリダイレクトさせる。このときCloudFrontを使っていない場合は、

www.example.com/hoge → www.example.com/hoge/

というリダイレクトになる。

ところが、CloudFrontを使っていると、

www.example.com/hoge → www-example-com-xxxxxxx.ap-northeast-1.elb.amazonaws.com/hoge/

のように、ALBのURLにリダイレクトがかかる。nginx視点で見た場合、 ALBのURLで動いているように見えるためと思われる。

仕方がないので、明示的にリダイレクトを書いた。

    if ($request_uri ~ ^([^.]*[^/])$) {
        return 301 https://www.example.com$request_uri/;
    }

もっと良い方法があるように思うが。。。

追記:HostヘッダをCloudFrontで通すようにすれば良さそう。