クエリ文字列
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/06/21 16:20 UTC 版)
クエリ文字列(クエリもじれつ、英: query string)、URLパラメータは、Webサーバに情報を送信するためにURLの末尾につける文字列である[1]。一般に、HTMLの一部として、ページの外観を選択したり、特定のコンテンツの位置にジャンプしたりするために、Webブラウザや他のアプリケーションソフトウェアによってURLに追加されるものを含む。

?title=Query_string&action=edit
"
WebサーバはHTTPリクエストを、URLパスに基づいてファイルシステムからファイルを読み込むか、リソースの種類に応じた方法で処理を行う。特別な処理が呼び出された場合、クエリ文字列はURLのパスコンポーネントとともに、その特別な処理を使用できるようになる。
構造
クエリ文字列を含む一般的なURLは次の通りである。
https://example.com/over/there?name=ferret
Webサーバはこのようなページへのリクエストを受け取ると、プログラムを実行する。このとき、クエリ文字列(この場合name=ferret
)はプログラムの実行に影響を及ぼさない。疑問符 "?
" は区切り文字であり、クエリ文字列の一部ではない[2][3]。
Webフレームワークは、クエリ文字列内の複数のパラメータを何らかの区切り文字で区切って解析する方法を有していることがある[4]。次の例では、複数のパラメータをアンパサンド "&
"で区切っている。
https://example.com/path/to/page?name=ferret&color=purple
クエリ文字列の構造は標準化されておらず、解析方法はWebサイトによって異なることがある。
HTMLでは、ユーザーエージェントがクエリ文字列を生成する3つの方法を定義している。
<form>...</form>
要素を使ったHTMLフォーム。<img>
要素のismap
属性を使用した、<img ismap>
構文でのサーバーサイド・イメージマップ。- HTML5で廃止された
<isindex>
要素を用いた検索フォーム。
Webフォーム
本来の用途のひとつは、HTMLフォームの内容を格納することである。例えば、フィールドfield1
, field2
, field3
を含むフォームが送信されると、フィールドの内容は以下のようにクエリ文字列としてエンコードされる。
field1=value1&field2=value2&field3=value3...
- クエリ文字列は、一連のフィールドと値のペアで構成される。
- 各ペア内では、フィールド名と値は等号 "
=
" で区切られる。 - 一連のペアはアンパサンド "
&
" で区切られる(セミコロン ";
" は、W3Cでは推奨されていない[4])。
明確な基準はないが、ほとんどのWebフレームワークでは、1つのフィールドに複数の値を関連づけることができる(例えば、field1=value1&field1=value2&field2=value3
)[5][6]。
フォームの各フィールドに対して、クエリ文字列はfield=value
のペアを含む。Webフォームには、ユーザーには表示されないフィールドが含まれることがある。これらのフィールドは、フォームが送信されるときにクエリ文字列に含まれる。
この規則はW3Cが推奨しているものである[4]。1999年、W3CはすべてのWebサーバがアンパサンド区切りに加えてセミコロン区切りをサポートし、アンパサンドを用いることなく、HTMLドキュメント内のURLでapplication/x-www-form-urlencodedクエリ文字列を使用できるようにすることを推奨した。2014年以降、W3Cは区切り文字としてアンパサンドのみを使用することを推奨している[7]。
フォーム送信方法がGETの場合、フォームの内容はURLのクエリ文字列にのみエンコードされる。送信方法がPOSTの場合、同じエンコーディングが既定として使用されるが、その結果は修正されたURLに含まれるのではなく、HTTPリクエストの本体として送信される[8]。
インデックス検索
HTMLにフォームが追加される以前は、ブラウザは<isindex>
要素を一行のテキスト入力コントロールとして表示していた。このコントロールに入力されたテキストは、ベースのURLまたはaction
属性で指定された他のURLへのGETリクエストの追加クエリ文字列としてサーバに送信された[9]。これは、Webサーバが与えられたテキストをクエリの条件として用い、一致するページのリストを返すことができるようにするためのものである[10]。
インデックス検索コントロールに入力されたテキストが送信されると、次のようにクエリ文字列としてエンコードされる。
argument1+argument2+argument3...
- クエリ文字列は、テキストをスペースで区切って単語に変換した一連の引数から構成される。
- 一連の引数はプラス記号 "
+
" で区切る。
URLエンコード
URLに用いることができない文字(空白文字など)や、URLの中で特殊な意味を持つ文字もある。たとえば、番号記号 "#
" を使えば、文書のサブセクション(またはフラグメント)を指定することができる。HTMLフォームでは、等号 "=
" が名前と値を区切るのに使われる。URIの汎用的な構文はURLエンコーディングでこれらの文字を回避するが、HTMLフォームはそのような文字すべてにパーセントエンコーディングを適用するのではなく、いくつか追加の置換を行う[11]。
HTML 5では、HTMLフォームをGETメソッドでWebサーバに送信する際の変換を次のように規定している。
- 正しい文字コードに変換できない文字は、HTMLの数値文字参照に置き換えられる[12]。
- 空白文字は "
+
" または "%20
" としてエンコードされる[11]。 - アルファベット、数字、チルダ "
~
"、ハイフンマイナス "-
"、終止符 ".
"、アンダースコア "_
" はそのままである。 - プラス記号 "+" は "
%2B
" としてエンコードされる。 - その他の文字はすべて
%HH
の十六進数でエンコードされ、ASCII以外の文字は最初にUTF-8(または指定された方法)でエンコードされる。
チルダ "~
" に対応するオクテットは、RFC 3986ではクエリ文字列で認められているが、HTMLフォームでは "%7E
" にパーセントエンコードする必要がある。
トラッキング
![]() |
この節は検証可能な参考文献や出典が全く示されていないか、不十分です。(2025年6月)
|
クエリ文字列を受け取ったプログラムは、その一部または全部を無視することができる。指定されたURLがプログラムではなくファイルに対応する場合、クエリ文字列はすべて無視される。しかし、クエリ文字列が使われているか否かに関係なく、クエリ文字列を含むURL全体がサーバのログファイルに保存される。
このことから、HTTP cookieと同様の方法でユーザーを追跡するためにクエリ文字列を使用することができる。これが機能するためには、ユーザーがページをダウンロードするたびに固有の識別子が決められ、そのページが含むすべてのリンクのURLにクエリ文字列として追加されなければならない。ユーザーがこれらのリンクのひとつをたどるとすぐに、対応するURLがサーバにリクエストされる。こうすることで、このページのダウンロードが前のページとリンクされる。
例えば、次のような内容のWebページがリクエストされた場合を考える。
<a href="foo.html">see my page!</a>
<a href="bar.html">mine is better</a>
固有の文字列としてe0a72cb2a2c7
が選ばれたとすると、Webページは次のように変更される。
<a href="foo.html?e0a72cb2a2c7">see my page!</a>
<a href="bar.html?e0a72cb2a2c7">mine is better</a>
クエリ文字列を追加しても、ページの見た目は変わらない。例えばユーザーが最初のリンクをたどると、ブラウザはサーバにfoo.html?e0a72cb2a2c7
というページをリクエストし、サーバは?
以降を無視してfoo.html
というページを送り、そのリンクにも同じクエリ文字列を追加する。
こうすることで、このユーザーからのその後のページリクエストはすべて同じクエリ文字列foo.html?e0a72cb2a2c7
が追加されることになるため、これらのページがすべて同じユーザーによって閲覧されたということを特定することができる。クエリ文字列は、Webビーコンと連携して使用されることが多い。
トラッキングに用いられるクエリ文字列とHTTP cookieの主な違いは次の通りである。
- クエリ文字列はURLの一部を形成するため、ユーザーがURLを保存したり、他のユーザーに送信したりする場合でも保持される。HTTP cookieは閲覧セッションを跨いで保持することができるが、URLとともに保存または送信されることはない。
- ユーザーが2つ(またはそれ以上)の独立した経路で同じWebサーバに到着した場合、保存されるHTTP cookieは同じものになるが、クエリ文字列は異なるものが割り当てられる。
- ユーザーは設定でHTTP cookieを無効にすることができ、その場合にはトラッキングにHTTP cookieを使用することはできない。一方、クエリ文字列は無効にできないため、トラッキングにクエリ文字列を使用すれば、どのような状況でも機能する。
- ページへのアクセスによって渡されるクエリ文字列が異なると、ブラウザ(プロキシがある場合はプロキシ)のキャッシュからページが提供されることがないため、Webサーバの負荷が増加し、ユーザーエクスペリエンスが低下する。
互換性の問題
HTTPの仕様によれば、
とされている。
URLが長すぎる場合、ウェブサーバーはHTTPステータスコード 414 URI Too Longで失敗する。
これらの問題への一般的な対応策は、GETの代わりにPOSTを使い、パラメータをリクエストボディに格納することである。リクエストボディの長さの制限は、一般的にURLの長さの制限よりもはるかに緩い。たとえば、POSTサイズの制限は、デフォルトでIIS 4.0では2 MB、IIS 5.0では128 KBである。Apache2ではLimitRequestBody
ディレクティブを使って制限を設定できる。LimitRequestBody
ディレクティブはリクエストボディに許容されるバイト数を0(無制限)から2147483647 (2 GB) までで指定できる[14]。
脚注
出典
- ^ “クエリ文字列(URLパラメーター)とは?Webサービス上の用途とその役割”. くりたま. デジタルハリウッド (2022年1月7日). 2025年6月21日閲覧。
- ^ Berners-Lee, T.; Fielding, R.; Masinter, L. (January 2005). "RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax". Request for Comments (英語). Internet Engineering Task Force. "Syntax Components" (section 3). 2025年2月23日閲覧。
- ^ Berners-Lee, T.; Fielding, R.; Masinter, L. (January 2005). "RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax". Request for Comments (英語). Internet Engineering Task Force. "Query" (section 3.4). 2025年2月23日閲覧。
- ^ a b c "Forms in HTML documents" (英語). W3C. 2013年9月8日閲覧。
- ^ "ServletRequest (Java EE 6)". Oracle (英語). 10 February 2011. 2013年9月8日閲覧。
- ^ "uri – Authoritative position of duplicate HTTP GET query keys". Stack Overflow (英語). 9 June 2013. 2013年9月8日閲覧。
- ^ "4.10 Forms — HTML5" (英語). W3C. 2013年9月8日閲覧。
- ^ "4.10.21.3 Form submission algorithm — HTML5.2" (英語). W3C. 2017年12月14日閲覧。
- ^ "<isindex>". HTML (HyperText Markup Language) (英語). 2017年10月19日時点のオリジナルよりアーカイブ。2015年11月21日閲覧。
- ^ "HTML/Elements/isindex". W3C Wiki (英語). 2021年6月22日時点のオリジナルよりアーカイブ。2020年3月20日閲覧。
- ^ a b "HTML URL Encoding Reference" (英語). W3Schools. 2013年5月1日閲覧。
- ^ "The application/x-www-form-urlencoded encoding algorithm — HTML5.2" (英語). W3C. 2017年12月14日閲覧。
- ^ "HTTP/1.1 Message Syntax and Routing". ietf.org (英語). 2014年7月31日閲覧。
- ^ "core – Apache HTTP Server". Httpd.apache.org (英語). 2013年9月8日閲覧。
関連項目
- Common Gateway Interface
- クリーンURL
- URI正規化
- URIフラグメント
- UTMパラメータ
外部リンク
- クエリ文字列 - IT用語辞典 e-Words
- クエリ文字列のページへのリンク