Elastic Beanstalk の nginx で静的ファイルにCORSヘッダーをつける方法

静的ファイルでも .woff といったフォントファイルはCORSヘッダーの制約を受けて別オリジンから読み込めないので、CORSヘッダーをつける必要があります。

そして、AWS の Elastic Beanstalk のウェブサーバー環境で nginx で配信されている静的ファイルにCORSヘッダーをつけるためには、nginx の conf を追加する必要があります。

これについて調べていてヒットしたのが以下の記事でした。

Enabling CORS on Elastic Beanstalk/Nginx with Amazon Linux 2

そこで示されていたのが以下の conf です。

location ~* .(eot|otf|ttf|woff|woff2|css|js)$ {
  add_header Access-Control-Allow-Origin *;
}

なんのことはない、静的ファイルな拡張子のファイルを配信する場合にCORSヘッダーをつける設定です。Beanstalk 的なポイントとしては、ファイルを置く場所が .platform/nginx/conf.d/elasticbeanstalk/ 内な必要があるというくらいです。(ここもハマりポイントではある)

しかさらに例外があり、Beanstalk の config で静的ファイルを配信する設定である aws:elasticbeanstalk:environment:proxy:staticfiles を使っていると、うまく動作しません。以下のような config です。

option_settings:
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /dist: public/dist

この config はデプロイ時に nginx の location ディレクティブを使った conf を書き出してくれる設定で、以下のような nginx 用の alias が書かれた conf が書き出されます。

location /dist {
  alias /var/app/current/public/dist;
  access_log off;
}

このまま先にに示した add_header の conf と同時に設定してしまうと、locationヘッダ優先順位の「最長マッチ」で add_header の location ディレクティブが適用されてしまい、alias の方の設定は無視されます。結果、静的ファイルが404になります。

なので、Beanstalk の nginx で配信する静的ファイルに対して設定を加える場合は、staticfiles は使わずに直接 alias を書くようにして、その中で add_header しましょう。

location /dist {
add_header Access-Control-Allow-Origin *;
alias /var/app/current/public/dist;
access_log off;
}

以上です。

コメント / トラックバック

コメントは受け付けていません。