クエリ文字列とは|?key=value の構造・複数値・パーセントエンコードをやさしく解説
URLの末尾でよく見る「?key=value&...」がクエリ文字列です。本記事では、クエリ文字列とは何かという基本から、?と&で区切られた構造、複数値や配列の表し方、パーセントエンコーディングの役割、GETでの使われ方、そして順序・重複・長さといった設計上の注意点までをやさしく解説します。
検索結果や商品一覧のページで、URLの末尾に「?q=cat&page=2」のような文字列がくっついているのを見たことはないでしょうか。これがクエリ文字列(クエリパラメータ)です。一見おまけのように見えますが、実は「どのページを、どんな条件で表示するか」をサーバーに伝えるための、Webの基本的な仕組みです。本記事では、クエリ文字列とは何か、どんな構造を持ち、どう設計すればよいのかを順を追って解説します。
クエリ文字列とは何か
クエリ文字列(query string)とは、URLの一部として付加され、サーバーに追加の情報(パラメータ)を渡すための文字列です。URLのパス部分の後ろに「?」を挟んで書かれ、その中身を構成する一つ一つのkey=valueの組をクエリパラメータと呼びます。
https://example.com/search?q=cat&page=2
この例では、?より後ろの「q=cat&page=2」がクエリ文字列です。「検索語(q)はcat」「ページ(page)は2」という2つの情報をサーバーに伝えています。サーバーはこの値を読み取り、それに応じたページ(猫の検索結果の2ページ目)を返します。
クエリ文字列の大きな特徴は、同じパスのページに、条件だけを変えてアクセスできる点です。検索語やページ番号、並び替えの順序、フィルタ条件などをURLに乗せることで、リンクやブックマークだけで特定の状態のページを再現できます。実際にどんな文字列になるかを試すには、クエリ文字列変換ツールでキーと値を入力し、組み立てられたURLを確かめてみると分かりやすいでしょう。
クエリ文字列の構造:?と&とkey=value
クエリ文字列の構造はシンプルで、3つの記号の役割を覚えれば読み解けます。
- ?(クエスチョンマーク):URLのパス部分とクエリ文字列の境目を示します。URLの中で最初に現れる
?から後ろが、クエリ文字列の領域です。 - =(イコール):一つのパラメータの中で、キー(名前)と値を区切ります。
q=catなら、キーがq、値がcatです。 - &(アンパサンド):複数のパラメータをつなぎます。
q=cat&page=2のように、パラメータごとに&で連結します。
つまり、クエリ文字列は「?で始まり、key=valueを&でいくつでもつなげた」構造です。値が空のパラメータ(flag=)や、値を省いてキーだけを置く書き方が使われる場合もありますが、基本はkey=valueの繰り返しだと考えれば十分です。
| 記号 | 役割 | 例 |
|---|---|---|
| ? | クエリ文字列の開始 | /search?q=cat |
| = | キーと値の区切り | q=cat |
| & | パラメータの連結 | q=cat&page=2 |
これらの記号は構造を表すための予約された文字です。そのため、キーや値の中身にこれらの記号そのものを含めたいときは、後述するパーセントエンコーディングで別の表現に置き換える必要があります。
複数値・配列の表し方
1つのキーに複数の値を持たせたい場面はよくあります。たとえば「色は赤と青の両方で絞り込みたい」といったケースです。クエリ文字列には配列のための公式な書式が1つに定まっているわけではなく、いくつかの慣習的な表し方があります。
- 同じキーを繰り返す:
color=red&color=blueのように、同じキーを複数回書く方法です。多くのフレームワークがこの形を配列として解釈します。 - 角括弧を付ける:
color[]=red&color[]=blueのように、キーに[]を付ける方法です。PHPなどでよく使われます。 - 区切り文字でまとめる:
color=red,blueのように、1つの値の中をカンマなどで区切る方法です。読みやすい反面、値そのものに区切り文字が含まれると曖昧になります。
どの方式を受け取れるかはサーバー側の実装に依存するため、送る側と受け取る側で解釈を合わせておくことが重要です。迷ったら、利用するフレームワークやAPIの仕様に従うのが安全です。複数値を含むURLが正しく組み立てられているかは、クエリ文字列変換ツールでパラメータを一覧表示して確認すると、見落としを防げます。
パーセントエンコーディング
クエリ文字列の値には、日本語、スペース、記号など、URLにそのまま書けない文字が含まれることがあります。そこで使われるのがパーセントエンコーディング(URLエンコード)です。これは、対象の文字をいったんバイト列に変換し、各バイトを%に続く2桁の16進数で表現する仕組みです。
たとえば半角スペースは%20に、日本語の「猫」はUTF-8のバイト列に基づいて%E7%8C%ABのように変換されます。前述の?・=・&のように構造上の意味を持つ記号を値として使いたいときも、エンコードして本来の意味と区別します。
- なぜ必要か:URLで使える文字には制限があり、また
&や=をそのまま値に入れると構造が壊れてしまうためです。 - 注意点:スペースは文脈によって
%20と+のどちらでも表されることがあります。クエリ文字列の歴史的な慣習では+が使われる場面もあるため、デコード時の扱いに注意します。
エンコードとデコードを手作業で行うと間違えやすいので、実際の変換はURLエンコードツールに任せるのが確実です。値を貼り付ければ、安全な形に変換した結果や、元に戻したデコード結果をその場で確認できます。クエリ文字列を扱うなら、URLエンコードツールとクエリ文字列変換ツールをセットで使うと作業がスムーズです。
GETでの使われ方
クエリ文字列がもっともよく使われるのは、HTTPのGETリクエストです。GETはサーバーから情報を「取得する」ためのメソッドで、検索やフィルタ、ページ送りのように同じ操作を何度繰り返しても結果が変わらない(副作用がない)処理に向いています。フォームをGETで送信すると、入力内容が自動的にクエリ文字列としてURLに付き、サーバーに渡されます。
GETでクエリ文字列を使う利点は、状態がURLに乗ることです。検索条件付きのページをそのままブックマークしたり、リンクとして共有したり、ブラウザの履歴から呼び戻したりできます。一方で、URLは履歴やサーバーのアクセスログに残るため、パスワードや個人情報のような秘密の値をクエリ文字列に入れるのは避けるべきです。そうした値の送信には、本文に情報を載せるPOSTなど別の方法が適しています。
つまりクエリ文字列は、「結果を取得する・状態を共有する」ようなGETの用途と相性が良く、「秘密の情報を送る・サーバーの状態を変更する」用途には向かない、という住み分けを理解しておくとよいでしょう。
設計の注意:順序・重複・長さ
クエリ文字列は自由度が高いぶん、設計をおろそかにすると思わぬ不具合やSEO上の問題を招きます。代表的な注意点を整理します。
1. パラメータの順序
?a=1&b=2と?b=2&a=1は、サーバーから見れば多くの場合同じ意味です。しかし、URLの文字列としては別物なので、キャッシュやアクセス解析では「違うURL」として数えられてしまうことがあります。同じ内容のページが複数のURLで存在すると、検索エンジンに重複コンテンツと見なされる原因にもなります。順序を一定に保つ、または正規化することが望ましいです。
2. キーの重複
前述のとおり、同じキーを複数回書くと配列として扱う実装が多い一方で、最初の値だけ/最後の値だけを採用する実装もあります。意図せずキーが重複すると、どの値が使われるか予測しづらくなります。重複させるなら配列として明示的に、そうでなければキーは一意に保つのが安全です。
3. 長さの上限
URL全体の長さには、ブラウザやサーバーごとに事実上の上限があります。パラメータを詰め込みすぎると、途中で切られたりエラーになったりする恐れがあります。大量のデータを渡したい場合はGETのクエリ文字列ではなくPOSTの本文を使う、といった判断が必要です。
クエリ文字列は、?・=・&という最小限の記号と、パーセントエンコーディングという仕組みだけで、URLに豊かな情報を乗せる基礎技術です。まずはクエリ文字列変換ツールでパラメータを組み立てたり分解したりして、構造を目で確かめてみてください。値のエンコードが必要になったらURLエンコードツールを併用すれば、手作業のミスを避けながら正しいURLを作れます。
なお本記事は一般的な情報の提供を目的としたものです。クエリ文字列の解釈や上限は、使用するブラウザ・サーバー・フレームワークによって異なります。実装にあたっては、最新の公式仕様やドキュメントを必ず確認したうえで判断してください。
よくある質問
クエリ文字列とクエリパラメータの違いは何ですか?
クエリ文字列は、URLの「?」より後ろに付く文字列全体を指します。クエリパラメータは、その中を構成する一つ一つの「key=value」の組のことです。たとえば「?q=cat&page=2」がクエリ文字列で、「q=cat」と「page=2」がそれぞれクエリパラメータです。
同じキーに複数の値を持たせるにはどうしますか?
公式に1つの書式が定まっているわけではなく、慣習的な表し方が複数あります。同じキーを繰り返す(color=red&color=blue)、角括弧を付ける(color[]=red&color[]=blue)、カンマ等で区切る(color=red,blue)などです。どれを受け取れるかはサーバーの実装次第なので、送る側と受け取る側で解釈を合わせることが大切です。
パーセントエンコーディングはなぜ必要ですか?
URLには使える文字に制限があり、また「?」「=」「&」のように構造上の意味を持つ記号を値にそのまま入れると構造が壊れてしまうためです。対象の文字をバイト列に変換し、各バイトを「%」に続く2桁の16進数で表すことで、安全に値として扱えるようになります。
クエリ文字列にパスワードを入れても大丈夫ですか?
避けるべきです。クエリ文字列はURLの一部として、ブラウザの履歴やサーバーのアクセスログ、リンク共有などに残ります。パスワードや個人情報のような秘密の値は、本文に情報を載せるPOSTなど別の方法で送るのが安全です。
クエリ文字列変換ツールで入力した値はサーバーに送信されますか?
WAZA TOOLSのクエリ文字列変換ツールやURLエンコードツールはすべてブラウザ内で処理され、入力した値がサーバーに送信・保存されることはありません。スマートフォンでも利用でき、何度でも無料でURLの組み立てや変換を確認できます。