Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

S3 Static Website Hostingで重複スラッシュがあると404になる挙動をnginxで再現する

Amazon S3の静的Webサイトホスティング (Static Website Hosting)、便利ですよね。安くて可用性高くてメンテナンスフリー。HTTPSは適当なCDN通せば良いので、頑張らないLPなんかは全部これにしたい。

ところで、S3 Static Website Hostingでは、index.htmlやエラーページに対応するなどだいぶウェブサイトらしい挙動をしてくれますが、ApacheやNginxといった一般的なHTTPサーバと完全に同じ挙動にはなりません。一例として、 http://example.com/images//image.png のようにURLの途中にスラッシュが複数あるような場合、多くのWebサーバではファイルが表示されますが、S3では404になります。

開発中にうっかりtypoしてスラッシュを重ねてしまい、ローカルのnginxで確認していて気づかず、デプロイしたらエラーになった、という事故は悲しいです。lint的なもので確認するのももちろん良いのですが、開発環境の挙動をS3に寄せたい、というときに、サクッとできる方法を試してみました。

以下のようなファイルを nginx.conf として保存します。

merge_slashes はデフォルトでONで、これがあるとURL内のスラッシュを勝手に1個にまとめてくれます。これをOFFにすると複数のままになりますが、その状態でも404にはならないので、手動で404にしてあげています。

user  nginx;
worker_processes  auto;

events {
    worker_connections  1024;
}


http {
    merge_slashes off;
    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            if ($request_uri ~* "//") {
                return 404;
            }
        }
    }
}

同じフォルダの webroot フォルダ以下にWebサイトのHTML一式が置いてあるとして、以下のコマンドでnginxを起動します。

docker run --rm -p 80:80 -v ./webroot:/usr/share/nginx/html -v ./nginx.conf:/etc/nginx/nginx.conf:ro nginx

無事に、スラッシュが重なったURLは404になりました。

以上、AIに聞けば10秒で解決しそうな小ネタでした。

関連記事

AWS SDK Rubyで標準出力へログが出るのを抑制する

Cloudflare R2のバケット名にドットは使えない


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。