目的
今回はURLについて解説します。URLは普段から馴染みがありますが、それが実際にどんな形式でどういったメカニズムで指定したページを表示するか理解できている人はそんなに多くないと思います(特にインフラエンジニア)。
今回はURLの仕組みやメカニズムに焦点を当てて使用される用語から解説していきます。
URLの仕組み
URLは必ず、
「スキーム://ホスト:ポート番号/パス?クエリ#フラグメント」
の形式になります。
次にそれぞれの用語について解説します。
スキーム
「通信プロトコル」を指します。URLの先頭に記載することで、通信手段を指定します。
言い換えると、「どういう仕組みでURLを扱うか」を指定します。
例えば、「mailto://」と指定するとメールアプリを起動してメールを送信します。
主な種類
・https:// → 暗号化されたWEBサイトへのアクセス
・mailto:// → メールを送るためメールアプリ起動
・Facetime:// → Facetime通話の開始
個別のアプリを起動するための「カスタムスキーム」も存在します。
例えば「comgooglemaps://」とすると「Google マップ」が起動します。
ホスト
「具体的な通信相手」を指定します。ここには「ホスト」だけでなく「ドメイン」も指定できます。
ドメインとは「lovelab.com」などの「範囲」を指し、ホストは「www.lovelab.com」「api.lovelab.com」「mail.lovelab.com」など「特定のサーバ」を指します。
*ホストの先頭の「www」「api」「mail」をサブドメインと言います。
URLを指定して、その通信相手を特定するためにDNSサーバに「IPアドレスとドメイン」、「IPアドレスとホスト」の紐付け情報をそれぞれ登録する必要があります。
ポート番号
1つの接続先でサービスの受付口を識別します。
言い換えると、「どのサービスに接続するか」を識別します。
例えば、HTTP通信だとポート番号80、HTTPS通信だとポート番号443を接続先のサーバで使用します。これは「ウェルノーンポート」と言い、標準ルールとして決まっています。
・IPアドレス:80 → HTTP
・IPアドレス:443 → HTTPS
・IPアドレス:22 → SSH
というように宛先のサーバの特定のサービスを指定します。
*HTTP、HTTPS通信の場合は「スキーマ」でプロトコルを指定するので、ポートを省略できます。
ポートに関連して、実務で注意すべきなのは「ファイアウォール」です。
送信元が「IPアドレス:ポート」を指定して通信してきても、接続先環境でファイアウォールがポート使用を許可していない場合は通信は拒否されます。
実務ではこのファイアウォールでのポート解放を忘れて通信がうまくいかないことがよくあります。
ポートを使用する場合、ファイアウォールの設定を忘れないようにしましょう。
しかし、使用しないポートは解放せずに閉じましょう。
パス
サーバ内の資源やAPIの対象を示します。
「どのリソースを要求するか」を表します。
例えば、下記のようになります。
・/users/* → ユーザ情報
・/products/* → 製品情報
・/api/* → apiの実行
また、パスでは事前に「このパスにアクセスしてきたらこのリソースを返します」といった「ルーティング設定」を行う必要があります。
パスは必ずしもサーバ上のディレクトリ階層を表しているわけでなく、実ファイルである必要もありません。
クエリ
パスで指定したリソースを条件付きで取得・処理できます。
形式として「キー=値」で表します。
例えば、下記のようになります。
・「/users?name=taro」→ nameがtaroのユーザ
・「/items?q=pen&sort=price&page=3」→ 3ページ目の商品一覧上のq=penを降順に表示
「&」を使って複数条件を指定できます。
フラグメント
URLの「#」以降に記述される部分です。
フラグメントは、URLの # 以降に記述される部分です。
https://example.com/users?page=2#profile
↑
フラグメント
フラグメントは、Webページ内の特定の場所を指定するためなどに使われます。
例えば、HTML側で次のように要素に id が設定されている場合、
<h2 id="profile">プロフィール</h2>
次のURLにアクセスすると、
https://example.com/users#profile
ブラウザがページ内の profile という場所まで移動します。
重要なのは、フラグメントは通常、サーバーへ送信されないという点です。
そのため、
https://example.com/users#profile
にアクセスした場合、サーバーへ送信されるHTTPリクエストには #profile は含まれません。
まとめ
上記をまとめるとURLの構成要素は以下のようになります。
- スキーム:どの通信方式を使うか
- ホスト:どのサーバー・サービスへ接続するか
- ポート:そのホストのどの通信窓口へ接続するか
- パス:どのリソース・処理を要求するか
- クエリ:検索条件やページ番号などの追加情報
- フラグメント:ページ内のどの場所を表示するか
このようにURLは、単なる「Webページの住所」ではなく、通信先や要求するリソース、さらにブラウザ側での表示位置まで表現できる情報になっています。

No responses yet