TL;DR
- URLは ドメイン名までは大文字小文字を区別しない が、パス以降は区別されうる
- 区別するかどうかはURL仕様で一律に決まっているわけではなく、サーバーや前段の実装次第
- ALB(Application Load Balancer)のリスナールールの パスパターン条件は大文字小文字を区別する(case-sensitive)
- 筆者はALBのパスパターンを大文字で指定していて、小文字URLがルールにマッチせず開けなかった
背景・きっかけ
「URLって大文字小文字を区別しないよね」とずっと思っていました。ブラウザに WWW.GOOGLE.COM と打っても普通に開けるので、その感覚は間違ってはいません。
ところが、ある日「大文字のURLだと開けるのに、小文字にすると開けない」という現象に遭遇しました。同じパスなのにケースを変えるだけで挙動が変わる。ここで自分の理解が雑だったことに気づきました。
調べて整理したところ、原因は ALBのリスナールールのパスパターンを大文字で指定していたこと でした。備忘録も兼ねて仕組みごとまとめておきます。
やったこと(仕組みの整理)
URLのどこが大文字小文字を区別するのか
URLは要素ごとに扱いが違います。
大文字小文字を区別しない(case-insensitive)部分
- スキーム:
HTTPもhttpも同じ - ホスト名(ドメイン):
Example.COMもexample.comも同じ。DNSが大文字小文字を区別しないため
区別される可能性がある(case-sensitiveになりうる)部分
- パス(
/Folder/File.html) - クエリ文字列(
?Name=Value) - フラグメント(
#Section)
ポイントは、パス以降は「URL仕様として一律に区別する」わけではなく、サーバー側の実装次第 だということです。RFC 3986 でも、スキームとホスト以外は大文字小文字を区別するものとして扱うのが原則とされています。
つまり境界線は / から後ろ。ドメインまでは区別せず、パス以降は区別されうる、と覚えるのが実務的です。
サーバーごとの挙動の違い
同じパスでも、下にあるファイルシステムや前段の構成で挙動が変わります。
- Linuxサーバー(ext4など): ファイルシステムが区別する。
/img/Logo.pngと/img/logo.pngは別物 - Windowsサーバー(NTFS) / IIS: ファイルシステムが区別しないので、素の静的ファイル配信なら同じファイルとして扱われることが多い
- CDN・リバースプロキシ・ロードバランサー: 独自にパスをマッチング・正規化しており、ここで区別される場合がある
IISで「大文字だと開けて小文字だと開けない」が起きるとしたら、素の静的配信ではなく URL Rewrite ルール(ignoreCase="false")やアプリ側のルーティングが絡んでいる可能性が高いです。
今回の犯人:ALBのリスナールール
ALBのリスナールールの条件は、要素ごとに区別する/しないが分かれています。
大文字小文字を区別する(case-sensitive)
- パスパターン条件(
/Images/*と/images/*は別物) - クエリ文字列条件
大文字小文字を区別しない(case-insensitive)
- ホストヘッダー条件(ドメイン名なので区別しない)
筆者は、あるパスパターンを大文字(例: /Api/*)で指定してターゲットグループに振り分けていました。そこに小文字(/api/*)でアクセスすると、そのルールにマッチせず、デフォルトアクション(別ターゲットや固定レスポンス、404など)に流れる。これが「大文字だと開けて小文字だと開けない」の正体でした。
ハマったポイント
- ALBのパスパターンは 正規表現ではなく、
*(複数文字)と?(1文字)のワイルドカードだけのシンプルなマッチング。だから正規表現的に大文字小文字を1ルールで吸収する、ということはできない - 「URLは区別しない」という思い込みで、パスのケースを疑うのが遅れた
- ドメインは区別しないので、そこだけ見ていると原因にたどり着けない
複数ケースを許容したい場合の対処
- 1ルールにパスを複数登録する: 同じルールの条件に
/Api/*と/api/*を両方並べる - ワイルドカードで吸収する: ケースが変わりうる部分を
*にする(ただしマッチ精度は落ちる) - アプリ側で正規化する: ALBは素通しにして、背後のアプリでパスを小文字化してルーティングする
結果・学び
- URLの大文字小文字は「ドメインまでは区別しない、パス以降は区別されうる」が正解
- 「区別されうる」以上、大文字小文字を揃えて書くのが安全。特にLinuxホスティングやALB配下ではケースのズレがリンク切れ・404の原因になる
- ロードバランサーやプロキシを挟んだ構成で挙動が怪しいときは、パスパターン条件のケース を真っ先に疑う
まとめ
「URLは大文字小文字を区別しない」は半分だけ正しく、区別しないのはドメインまで。パス以降はサーバーや前段の実装次第で区別されます。今回のようにALBのパスパターンを大文字で指定していると、小文字URLはルールにマッチせず通らなくなります。
同じような「大文字だと開けるのに小文字だとダメ」に遭遇したら、ファイルシステム・URL Rewrite・ロードバランサーのパスパターンあたりのケース設定を確認してみてください。

コメント