URLの拡張子が大文字小文字を区別するかは何が決めている？


ロリポップを使っていて画像が表示されなかったので原因究明すると  
理由は拡張子のJPGがjpgと指定されていたからでした

これで疑問に思ったんですが

  * JPGとjpg
  * JPGとjpeg
  * `http://example.com/about` と `http://EXAMPLE.COM/about`
  * `http://example.com/About` と `http://example.com/about`

こういった大文字小文字は区別は何がしているのでしょう

ブラウザ、サーバー、それともルーターとか別の何かでしょうか？

区別するという情報は出てきますが何がどうやって、なぜ区別しているのかを書かれているサイトがまったくみつからなかったです




`http://exampple.com/path/to/somedir/somefile.someextension?query=q#frag`
を例にします。

ルータは単にデータを中継するだけなので、データを改変せずに流すだけのものです。  
ブラウザも得た html を表示するだけなので、ブラウザも URL の大文字小文字を区別しません。

# 一部のクローラは誤解から URL を全部小文字に変換してしまうものもあるとのこと。

というわけで、区別するとしたらサーバ側です。小文字に変換しちゃうのもサーバ側。で、以下 TL;DR

<https://www.rfc-editor.org/rfc/rfc3986>  
<https://triple-underscore.github.io/rfc-others/RFC3986-ja.html>  
`http://` の部分は「スキーム」と呼ばれます。ここは大文字小文字を区別しないが、小文字にすべきとあります。

<http://www5d.biglobe.ne.jp/stssk/rfc/rfc4343j.html>  
`example.com` の部分はドメイン名 (オーソリティ) ですが、ここも大文字小文字を区別しません。慣例的に小文字を使うことになっている模様。実際
`HTTPS://JA.STACKOVERFLOW.COM` を開くと、開けるけれども web server (と DNS server) が URL
を小文字に変換してしまいます。

# バグっているクローラが以下略。なので URL には小文字を使ったほうが安全なことが多い以下略。

`path/to/somedir/somefile.someextension` の部分はパス  
`?query=q` はクエリ  
`#frag` はフラグメント  
これらには大文字小文字規定がなく、よって大文字を使ってもいいし小文字を使ってもいいし、区別してもいいし区別しなくてもいいとのこと。実際
`stackoverflow.com` は小文字表記を `wikipedia.org` はキャピタル表記を好んで使っています。  
名目上パスと名付けられていますが URL 内パスが実際に web server 上の真のファイルを指すかどうかも決まっていなくて、プログラムが URL
を生成解釈している場合にはこのパス部分は web server 上で動いているプログラムに対するパラメータにすぎません。

プログラムに対するパラメータなら大文字小文字を区別するか否かはプログラムの仕様次第。  
（そのままデータベースに query を発行しているなら、データベースの照合設定による）  
真にファイル名なら大文字小文字を区別するか否かはファイルシステムの仕様次第。

あなたの書いた HTML ファイル内のリンクは真にファイル `dir/image.jpg` を指していて  
ロリポップの web server はファイル名の大文字小文字を区別する仕様で (Linux 系)  
だから提示の状況においては「 Linux OS がファイル名の大文字小文字を区別する仕様だから、真にファイル名を指す path
にいては大文字小文字が区別された」ということになりそうです。

web server 上で HTML を生成するプログラムが URL
のパス部を受け取る・返却する場合においてはそのプログラムが大文字小文字を区別するか否か、小文字（あるいはキャピタル）に正規化するか否かの仕様次第ということです。




`http://exampple.com/path/to/somedir/somefile.someextension?query=q#frag`
を例にします。

ルータは単にデータを中継するだけなので、データを改変せずに流すだけのものです。  
ブラウザも得た html を表示するだけなので、ブラウザも URL の大文字小文字を区別しません。

# 一部のクローラは誤解から URL を全部小文字に変換してしまうものもあるとのこと。

というわけで、区別するとしたらサーバ側です。小文字に変換しちゃうのもサーバ側。で、以下 TL;DR

<https://www.rfc-editor.org/rfc/rfc3986>  
<https://triple-underscore.github.io/rfc-others/RFC3986-ja.html>  
`http://` の部分は「スキーム」と呼ばれます。ここは大文字小文字を区別しないが、小文字にすべきとあります。

<http://www5d.biglobe.ne.jp/stssk/rfc/rfc4343j.html>  
`example.com` の部分はドメイン名 (オーソリティ) ですが、ここも大文字小文字を区別しません。慣例的に小文字を使うことになっている模様。実際
`HTTPS://JA.STACKOVERFLOW.COM` を開くと、開けるけれども web server (と DNS server) が URL
を小文字に変換してしまいます。

# バグっているクローラが以下略。なので URL には小文字を使ったほうが安全なことが多い以下略。

`path/to/somedir/somefile.someextension` の部分はパス  
`?query=q` はクエリ  
`#frag` はフラグメント  
これらには大文字小文字規定がなく、よって大文字を使ってもいいし小文字を使ってもいいし、区別してもいいし区別しなくてもいいとのこと。実際
`stackoverflow.com` は小文字表記を `wikipedia.org` はキャピタル表記を好んで使っています。  
名目上パスと名付けられていますが URL 内パスが実際に web server 上の真のファイルを指すかどうかも決まっていなくて、プログラムが URL
を生成解釈している場合にはこのパス部分は web server 上で動いているプログラムに対するパラメータにすぎません。

プログラムに対するパラメータなら大文字小文字を区別するか否かはプログラムの仕様次第。  
（そのままデータベースに query を発行しているなら、データベースの照合設定による）  
真にファイル名なら大文字小文字を区別するか否かはファイルシステムの仕様次第。

あなたの書いた HTML ファイル内のリンクは真にファイル `dir/image.jpg` を指していて  
ロリポップの web server はファイル名の大文字小文字を区別する仕様で (Linux 系)  
だから提示の状況においては「 Linux OS がファイル名の大文字小文字を区別する仕様だから、真にファイル名を指す path
にいては大文字小文字が区別された」ということになりそうです。

web server 上で HTML を生成するプログラムが URL
のパス部を受け取る・返却する場合においてはそのプログラムが大文字小文字を区別するか否か、小文字（あるいはキャピタル）に正規化するか否かの仕様次第ということです。

