Web - URI

2024年11月12日 (火) 00:53時点におけるWiki (トーク | 投稿記録)による版 (→‎URN (Uniform Resource Name))
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

概要

URI (Uniform Resource Identifier) とは、インターネット上のリソースを一意に特定するための識別子であり、統一資源識別子と訳される。

URIは、スキームと呼ばれる部分から始まる。
例えば、https:// や ftp:// といったプロトコルである。

このスキームの後に、実際のリソースを特定するための情報が続く。
https://www.example.com:8080/path/to/resource?key=value#section

上記の例では、httpsがスキーム、www.example.comがホスト名 (ドメイン名)、8080がポート番号を表す。
その後のパス (/path/to/resource) は、サーバ上の特定のリソースの場所を示す。
クエリパラメータ (?key=value) では追加の情報を渡しており、フラグメント (#section) は文書内の特定の場所を指定する。

URIの重要な特徴は、柔軟性と拡張性である。
インターネット上のあらゆるリソースを識別できるよう設計されており、Webページのアドレスだけでなく、メールアドレス (mailto:) やファイル共有プロトコル (ftp:) 等も表現できる。

また、URIは人間が読める形式であることも特徴である。
例えば、https://www.example.com/products/books というURIでは、exampleドメインの製品カテゴリーの中の書籍に関するページであることが推測できる。

ただし、URIには制約もある。
使用できる文字は限られており、特殊文字や空白等は適切にエンコードする必要がある。
例えば、スペースは「%20」として表現される。


URI (Uniform Resource Identifier)

リソースを一意に識別するための文字列の形式である。
URLとURNの上位概念として位置づけられる。

URIは、以下に示す形式で表現される。

<スキーム名>:<スキーム依存部分>



URL (Uniform Resource Locator)

リソースの場所を指定する形式である。
URIの一種であり、主に、Web上のリソースのアドレスを表現する。

URLは、以下に示す要素で構成される。

  • スキーム (プロトコル)
  • ホスト名
  • ポート番号 (省略可)
  • パス
  • クエリパラメータ (省略可)
  • フラグメント (省略可)



URN (Uniform Resource Name)

リソースの名前を指定する形式である。
場所に依存せず、永続的な識別子として機能する。

例: ISBN番号やUUID等


URIとURLの違い

主な違いを以下に示す。

  • URLは、どこにあるかを示すものである。
  • URNは、何であるかを示すものである。
  • 全てのURLはURIであるが、全てのURIがURLというわけではない。
  • URLは場所が変更されると機能しなくなる可能性があるが、URNは永続的である。


URIは識別子の大きな枠組みを提供しており、その中でURLは場所、URNは名前を指定する役割を果たす。

URLの例

https://www.example.com:8080/path/to/page?id=123#section1

  • スキーム
    https
  • ホスト名 (ドメイン名)
    www.example.com
  • ポート
    8080
  • パス
    /path/to/page
  • クエリパラメータ
    id=123
  • フラグメント
    section1


以下に示す記述もURLである。
mailto:example@example.com

  • スキーム
    mailto
  • スキーム依存部分
    example@example.com


mailtoは、以下に示す理由からURLに分類される。

  • リソースへのアクセス方法 (メールクライアントの起動) を指定している。
  • 操作可能なアクション (メール送信) を提供している。
    mailtoは、メールクライアントを起動するための操作的なスキームである。
  • URNのような永続的な識別子ではなく、mailtoは通信手段を示している。


URN (URLではないURI) の例

urn:isbn:0-486-27557-4

  • スキーム
    urn
  • 識別子タイプ
    isbn
  • 識別番号
    0-486-27557-4


以下に示す記述もURNである。

# 書籍のISBN (ISBNは本を一意に識別する)
isbn:0-486-27557-4

# UUID (UUIDはグローバルにユニークな識別子)
uuid:550e8400-e29b-41d4-a716-446655440000

# 法人識別子 (LEIは金融機関を一意に識別する)
lei:969500P37YF46QNWK024



クエリパラメータ

クエリパラメータを含めた文字列全体はURLである。

例: https://example.com/search.php?keyword=太郎&page=2&sort=desc#section1

上記のURLは以下のような構造に分解できる。
これら全ての要素を含めて、1つのURLとして扱う。

  • スキーム (プロトコル)
    https://
  • ホスト名
    example.com
  • パス
    /search.php
  • クエリ文字列
    ?keyword=太郎&page=2&sort=desc
  • フラグメント識別子
    #section1


※注意
クエリパラメータを含む完全なURL文字列は、以下に示すような特徴があることに注意する。
ただし、セキュリティ上の理由から、パスワード等の機密情報をURLのクエリパラメータに含めることは避けるべきである。

  • 有効なURLとして扱われる。
  • プログラムで解析可能。
  • Webブラウザで正しく解釈される。


  • 文字エンコーディング
    // 日本語等の場合はURLエンコードが必要
    $encodedKeyword = urlencode("太郎");
    $url = "https://example.com/search.php?keyword=" . $encodedKeyword;
    

  • 複数パラメータの結合
    // クエリパラメータは、&で連結
    $params = [
       'keyword' => '太郎',
       'page' => 2,
       'sort' => 'desc'
    ];
    $queryString = http_build_query($params);
    $url                = "https://example.com/search.php?" . $queryString;
    

  • 最大長の制限
    Webブラウザによって異なるが、通常2,000〜8,000文字程度
    長すぎるクエリは、POSTメソッドを使用する。

  • PHPでの取り扱い例
    // URLの解析
    $url = "https://example.com/search.php?keyword=太郎&page=2";
    $parsedUrl = parse_url($url);
    
    print_r($parsedUrl);
    
    // 出力
    Array (
       [scheme] => https
       [host] => example.com
       [path] => /search.php
       [query] => keyword=太郎&page=2
    )
    

  • クエリ文字列の解析
    parse_str($parsedUrl['query'], $queryParams);
    print_r($queryParams);
    
    // 出力
    Array (
       [keyword] => 太郎
       [page] => 2
    )