62188


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

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

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

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

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

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


CC BY-SA 4.0
2020-01-12T05:34:16.280
62178
2020-01-12T11:13:12.220
2020-01-12T05:41:57.910
3060
37046
question
browser url
URLの拡張子が大文字小文字を区別するかは何が決めている？


> 大文字小文字は区別は何がしているのでしょう  
>  ブラウザ、サーバー、それともルーターとか別の何かでしょうか？  
>  なぜ区別しているのかを書かれているサイトがまったくみつからなかったです

たしかに・・。  
どんな仕組みで ブラウザから WEB サーバーに データをやり取りしているか、  
ちゃんと説明すると面倒ですしね・・。

ざっくりした回答としては

[code]

    一言でいうと、Windows は 昔から大文字小文字を区別しない主義。
    Linux は 大文字小文字を区別する主義。
    Apache では 外部モジュールの設定によって 大文字小文字を区別しなくすることもできるが
    最初からは設定されていない事が多い。
    ASP.NET Core は Linux であっても 大文字小文字を区別しない。
    そのほかの WEB サーバー (Ruby on Rails , Tomcat 等) は その設定を確認してください。
    
[/code]

という感じになります。

* * *

より詳しい事を勉強したいのであれば、

[タネンバウム本](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E7%AC%AC5%E7%89%88-%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%BBS%E3%83%BB%E3%82%BF%E3%83%8D%E3%83%B3%E3%83%90%E3%82%A6%E3%83%A0/dp/482228476X)には
IIS や Apache の 前までは 詳細に載っています。  
IIS や Apache は ネット上にドキュメントはたくさんあると思います。  
そこから先の Tomcat や ASP.NET Core 等は も マニュアルは 公開されていると思います。

読み終えた頃には アプリも開発できる 立派なインフラ技術者になっているでしょう。

* * *

かいつまんで <http://example.com/about> の 例で 解説すると

昔から RFC 等で 厳密に決まっている部分と、アプリ毎に自由に設定できる部分に分かれます。

## 1) URL を サーバー部分と それ以外に分ける

URI の 仕様に沿って ブラウザが URL を 分解する。  
分解するだけで 大文字小文字は変換しない。

http:// の部分がスキーム ( https:// や file:// ）  
example.com の部分 が サーバー名  
/about の部分が HTTP サーバーに送信する パス や クエリ

[RFC3986 日本語訳](https://triple-underscore.github.io/rfc-others/RFC3986-ja.html)
がわかりやすいようです。

## 2) サーバー名を IP アドレスに変換する

DNS サーバーの仕組みを使って example.com を IPアドレスに変換します。  
DNSでは 大文字小文字は 区別しないため、大文字 EXAMPLE.COM でも 小文字 example.com でも  
同じ IPアドレスを返します。

## 3) WEB サーバー に ページの要求を出す ( ブラウザから )

上記 2) で 見つかった サーバーに対して tcp ポート 80 番に 向かって telnet 要求を投げます。

[code]

    GET /about
    
[/code]

このとき ブラウザから 大文字小文字を変換せずに要求を出します。  
※ ただし `/help.html#section1` の `#section1` (フラグメントは) ブラウザ側で取り除いて  
`GET /help.html` と URL のセグメント部分以降を切り取って要求を出します。

## 4) WEB サイト ルーター の動作

企業では WEB サーバー の前に 性能改善のための ロードバランサーや、キャッシュサーバー や ルーターが存在します。  
ここでは 大文字小文字変換も 文字加工もせずに WEB サーバーに要求を投げます。

## 5) WEB サーバー

Windows であれば IIS 、Linux であれば inetd や xinetd 経由で Apache 等 サーバーアプリケーションが ポート 80
番の口を開けて 要求を待っています。  
入力された `GET /about` を解析して パスに対応した WEB アプリケーションを起動します。

## 5-1) IIS の場合

IIS では サーバー上に複数の アプリを ディレクトリを変えて設定できいます。  
`/app1/about`  
`/app2/about`  
で 別のディレクトリに配布された アプリを起動して そのアプリに対して `/about` を投げます。

IIS の管理ツールで 仮想パス毎に 起動する WEB アプリケーションが設定できると思います。  
この場合 IIS では パスの 大文字、小文字は 区別しません。

### 5-1-1) IIS から呼び出された WEB アプリ

実に様々な アプリが呼び出されますが、そのアプリによって 大文字、小文字を区別するか  
どうかは 異なります。  
そもそも、Windows では ファイルシステムが 大文字小文字を区別しないことと、  
ASP.NET や ASP.NET Core では 大文字小文字を区別しないという ロジックがアプリに組み込まれているため、大文字小文字を区別しません。

## 5-2) Linux の場合

すみません、Linux は あまり詳しくありません。  
Linux は 昔から 大文字小文字を区別するという文化があるため、大文字小文字の違いは  
注意が必要だと思います。

Apache であれば `mod_spelling` というモジュールを組み込めば 大文字小文字の違いを吸収して  
くれるようですが レンタルサーバーに モジュールを組み込み可能なのかは  
レンタルサーバーの マニュアルを見てください。

* * *

とこんな感じでしょうか。  
お仕事で WEB アプリの 障害切り分けをする人は、この程度の知識は持っていると思います。

使うだけの人は ここまで知る必要はないので、わかる人に聞いてください。


CC BY-SA 4.0
2020-01-12T07:18:22.710
62182
2020-01-12T07:18:22.710
18851
62178
answer


`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
のパス部を受け取る・返却する場合においてはそのプログラムが大文字小文字を区別するか否か、小文字（あるいはキャピタル）に正規化するか否かの仕様次第ということです。


CC BY-SA 4.0
2020-01-12T11:13:12.220
62188
2020-01-12T11:13:12.220
2021-10-07T07:34:52.683
-1
8589
62178
answer