URLのクエリストリングとは:構造の読み方と作り方

URLの「?」以降の文字列は一見ランダムに見えますが、実はパターンさえ知れば読み解ける、厳格な構造に従っています。

「?」で始まり「&」でパラメータを区切る

https://example.com/search?q=cats&sort=new のように、「?」以降がクエリストリングで、「&」が個々のkey=valueのペアを区切っている。

各パラメータはkey=valueの組で表される

q=cats は「q」というパラメータの値が「cats」であることを意味する。順序は基本的に意味を持たず、URLには任意の数のパラメータを含められる。

特殊文字はパーセントエンコードされる

URLの中で特別な意味を持つ文字(スペース、&、=、?、非ASCII文字など)は%XXという16進数のコードに変換される。スペースは%20や+になるため、「new york」は「new%20york」のようになる。

同じキーが複数回現れることもある

tag=cat&tag=dog のようにキーを繰り返す方法や、tag[]=cat&tag[]=dog のような角括弧表記でリスト(配列)を表現するシステムもある。どちらの解釈になるかはURL自体の共通ルールではなく、受け取る側のバックエンドやフレームワーク次第。

UTMパラメータもクエリストリングの一種にすぎない

utm_source、utm_medium、utm_campaignなどはURLの特別な機能ではなく、Googleアナリティクスなどの解析ツールが読み取る約束事として広まった非公式な命名規則で、URLには通常のクエリパラメータとして追加されているだけ。

クエリストリングが存在する理由

可能性のある状態ごとに別のページを用意しなくても、1つのURL・ページで可変のデータを渡せるようにするために存在します。検索結果やフィルタ、ページネーション、トラッキング、APIリクエストなどはいずれもURLを通じてパラメータを渡すこの仕組みに依存しています。特定のフィルタ条件をブックマークしたり共有したりできるのも、状態そのものがURLに保存されているためです。

手作業でクエリストリングを組み立てる方法

各key=valueのペアを「&」でつなぎ、それぞれのキーと値に含まれる特殊文字を先にパーセントエンコードした上で、全体の先頭に「?」を付けてベースとなるURLに追加します。このエンコードの工程を正しく行わないことが、特にスペースや非ASCII文字を含む場合にリンクが壊れる最もよくある原因です。

よくある質問

クエリストリングは見えてしまうのですか、安全性はありますか?

はい、ブラウザのアドレスバーや閲覧履歴、サーバーのログ、他サイトに送られる「Referer」ヘッダーなどに完全に表示されてしまいます。そのためパスワードのような機密情報を渡す用途には絶対に使うべきではなく、HTTPS通信であっても「安全」とは言えません。

クエリストリングとURLのパス部分はどう違うのですか?

パス(/products/shoesのような部分)は通常、比較的固定された階層構造で特定のリソースを指し示します。クエリストリング(?color=red&size=10)は、そのリソースを絞り込んだり調整したりするための任意の可変パラメータのためのもので、組み合わせごとに全く別のパスを用意する必要をなくす役割を持っています。