URLクエリは「?」のあとに「名前=値」を「&」でつないだ部分です
URLの ? から # の手前までがクエリ(クエリ文字列)です。https://shop.example.com/products?color=white&size=270 なら、クエリは color=white&size=270 で、& で区切られた2つの項目に、名前 color・size と値 white・270 が入っています。クエリは検索語、ページ番号、絞り込み条件、広告の計測値のように、同じページへ付け足す情報をサーバーやスクリプトに渡します。各名前にどんな意味を持たせるかは、サイトごとに決まります。
このツールは、貼り付けたURLのクエリを「名前・値」の表に分解し、表を直すとすぐURLを組み立て直します。パーセントエンコードされた日本語や記号は読める文字で表示し、触れていない項目は元の表記のまま残します。広告・分析会社が付ける計測パラメータは、公式ドキュメントで確認できた名前だけを識別して表示し、ワンクリックで除けます。同じ名前が複数回出たとき、PHP・Python・Javaなどのサーバーがどの値を読むかも並べて確認できます。入力したURLがブラウザーの外へ送られることはありません。
クエリを表にして確かめたい場面
- リンクを共有する前に: 広告やメールで受け取ったリンクには、
utm_source・gclid・fbclidなどの計測値が長く付いています。除いてから共有すれば、URLが短くなり、広告クリック1回やメール受信者1人を指すIDが、別の人の訪問に再利用されません。 - キャンペーン用リンクを作る・点検するとき: utm_source・utm_medium・utm_campaign の綴りと値が合っているか、同じ名前が2回入っていないかが、表ですぐ見えます。「+ UTM」を押すと、3つの項目が空欄で入ります。
- 絞り込み条件がサーバーに正しく届くか調べるとき:
color=white&color=blackを、PHPは最後の値1つ、Pythonは2つの値のリストとして読みます。サーバーが実際に受け取る値を、先に見比べられます。 - アクセスログに残ったURLを読むとき: サーバーログや分析ツールには、検索語や絞り込み条件がエンコードされたまま残ります。項目ごとに読める文字へ戻して確認します。
使い方
- 貼り付け: 「元のURL」欄には、URL全体(
https://…)、?で始まるクエリ、name=kim&page=2のようなクエリだけのどれでも入れられます。クエリは名前・値の表に分かれ、URLの前半部分と#以降のフラグメントは別の欄に置かれます。 - 計測値を除く: 長さバーで、縞模様の区画がクリック・識別ID、薄いオレンジの区画がキャンペーンタグです。「クリックIDを除く」は gclid・fbclid のようなIDだけを、「計測値をすべて除く」はUTMのようなキャンペーンタグまで除きます。除いたあとでも「取り消し」ですぐ戻せます。
- 表を直す: 値の欄には、エンコードしていない文字をそのまま書きます。Enterで次の欄へ進み、最後の行では新しい項目が増えます(値の中の改行は Shift+Enter)。×で項目を削除し、「名前順」で並べ替え、「元に戻す」で最初の状態に戻せます。
- 値の中のURLを開く: 値がURLなら、表示の列に「表で開く」が出ます。内側のURLを同じ方法で直し、「外側のURLへ」を押すと、外側の項目の値に入ります。
- コピー: 組み立て直したURLを、URL全体・クエリのみ・JSONから選んでコピーします。変更した項目には下線が引かれます。変更した項目の空白を
+にするか%20にするか、触れていない項目の元の表記を保つかも選べます。 - サーバーが読む値を見る: 表で項目を選ぶと、その名前を8つの環境がどう読むかが下のカードに出ます。カード左端の色が読み方(最初の値・最後の値・リスト・カンマでつなぐ・捨てる)を表します。
クエリを区切る記号
URL標準(WHATWG)のクエリ解釈規則(application/x-www-form-urlencoded)では、クエリを & で切り、各断片を最初の = で名前と値に分け、+ を空白に、%XX をバイトに戻してUTF-8として読みます。ブラウザーの URLSearchParams はこの規則どおりに動き、このツールも同じ規則で表を作ります。
| 記号 | 働き | 例 | 表に出る値 |
|---|---|---|---|
? | クエリの始まり。URLで最初に出る ? の後ろです。クエリの中の ? は通常の文字です | /search?q=a?b | q → a?b |
& | 項目と項目の境目 | a=1&b=2 | a → 1, b → 2 |
= | 名前と値の境目。最初の = だけを使います | a=1=2 | a → 1=2 |
# | クエリの終わりで、フラグメントの始まり。フラグメントはサーバーへ送られません | ?q=a#top | q → a, フラグメント top |
+ | 空白 | q=red+shoe | q → red shoe |
%XX | 1バイト(16進数2桁) | k=%E6%9D%B1 | k → 東 |
; | 区切り記号ではない | z=1;w=2 | z → 1;w=2 |
等号のない flag は値が空の項目として読まれ、flag= と同じになります。&& のような空の断片は読み飛ばします。HTML 4.01の仕様は、サーバーが & のかわりに ; も受け付けるよう勧めていましたが、現在のURL標準とPythonのparse_qsは & だけを区切りに使います。Goは ; を含むペアを不正とみなして捨てます。
名前と値を読む規則
| クエリの原文 | 表に出る値 | 理由 |
|---|---|---|
q=red+shoe | red shoe | + は空白です |
lang=C%2B%2B | C++ | 文字そのものの「+」は %2B と書きます |
lang=C++ | Cのあとに空白2つ | 2つの + がどちらも空白として読まれます |
p=100% | 100% | 後ろに16進数2桁が続かない % は文字として残ります(表示の列に「不正な%」) |
b=%2526 | %26 | デコードは1回だけです。二重にエンコードされた値は1段階ぶん残ります |
e=%93%8C | �� | Shift_JISで書いた「東」なので、UTF-8としては読めません(表示の列に「UTF-8ではない」) |
flag | (空の値) | 等号がなければ、値が空の項目です(表示の列に「= なし」) |
UTF-8ではない古い文字コードで作られた値は、表では文字化けして見えます。その項目を直さなければ、「元の表記を保持」が元のバイトをそのまま残すので、組み立て直したURLも元どおりに開けます。文字化けした値の中身を確かめるには、URLエンコード・デコードの文字コード自動判定を使います。
計測パラメータ: どれを除いてよいか
計測パラメータは、ページの内容とは関係なく、訪問者がどの広告・メール・キャンペーンから来たかを伝えるために付く項目です。除いてもたいてい同じページが開きますが、サイト運営者はその訪問の流入経路を把握できなくなります。このツールは、各社の公式ドキュメントで確認できた名前だけを表示し、2つに分けます。
- クリック・識別ID(バーの縞模様): 広告クリック1回、メール受信者1人、訪問1回を指す値です。他の人に渡す理由がないので、共有する前に除くのがおすすめです。
- キャンペーンタグ(バーの薄い区画): どの参照元・メディア・キャンペーンかを書いた名前です。自分で作ったキャンペーンリンクなら残し、他人のリンクを転記するときは除いても構いません。
| 名前 | 付ける側 | 意味 | 分類 |
|---|---|---|---|
utm_source utm_medium utm_campaign utm_term utm_content | リンクを作る広告主(Googleアナリティクスが読む) | 参照元・メディア・キャンペーン・キーワード・広告コンテンツ | キャンペーンタグ |
utm_id utm_source_platform utm_creative_format utm_marketing_tactic | 広告主(購入プラットフォームは一部のGoogleプラットフォームが自動で付ける) | キャンペーンID・購入プラットフォーム・クリエイティブ形式・ターゲティング方式 | キャンペーンタグ |
gclid gbraid wbraid | Google広告の自動タグ付け | 広告クリックID(gbraid・wbraidはiOSのコンバージョン計測用) | クリック・識別ID |
gad_source gad_campaignid | Google広告 | 広告の参照元と、クリックを生んだキャンペーンの番号 | キャンペーンタグ |
dclid | Campaign Manager 360・Display & Video 360 | ディスプレイ広告のクリックID | クリック・識別ID |
srsltid | Google Merchant Centerの自動タグ付け | Googleショッピングの無料リスティングからの訪問を示す値 | クリック・識別ID |
_gl | Googleタグ(クロスドメイン計測) | 別ドメインへ移るとき、訪問情報を引き継ぐリンカー値 | クリック・識別ID |
fbclid | Meta | Facebook・Instagramのリンククリックの識別ID | クリック・識別ID |
msclkid | Microsoft Advertisingの自動タグ付け | 広告クリックID | クリック・識別ID |
ttclid twclid li_fat_id | TikTok · X · LinkedIn | 各社の広告クリックID | クリック・識別ID |
mc_eid | Mailchimp(eコマース計測を有効にしたキャンペーン) | メール受信者のID | クリック・識別ID |
mc_cid | Mailchimp | リンクを作ったメールキャンペーンのID | キャンペーンタグ |
_hsenc _hsmi | HubSpotのメール | 受信者の識別・メールクリックの追跡 | クリック・識別ID |
yclid | Yandex Direct | 広告クリックID | クリック・識別ID |
mtm_campaign pk_campaign など | Matomo分析 | キャンペーン名・キーワード・参照元の名前 | キャンペーンタグ |
NaPm | Naver広告(韓国の検索サービス) | 広告をクリックしたときに付き、コンバージョン計測に使われる値 | クリック・識別ID |
YouTubeの共有リンクの si や、Instagramの共有リンクの igsh のように、公式の説明が見つからない値は一覧に入れていません。意味を把握したうえで除くなら、表で×を押します。ref・source・from のように名前が似ているだけの項目は、サイトがページの内容そのものに使う場合もあるため、触れません。
同じ名前が複数回出ると、サーバーごとに読み方が違います
tag=red&tag=blue のように名前が重なると、URL標準は2つの項目を順番どおり両方とも残します。そのあとどの値を使うかは、受け取る側の言語・フレームワークが決めるので、方式はばらばらです。ショッピングサイトの絞り込みのように、複数の値をわざと重ねて送る場面が多く、サーバーが値を1つしか読まないと、選んだ条件の一部が消えてしまいます。
| 環境 | 読むコード | 結果 | 読み方 |
|---|---|---|---|
| JavaScript | new URLSearchParams(q).get('tag') | "red" | 最初の値(getAllなら両方) |
| PHP | $_GET['tag'] | "blue" | 最後の値 |
| Python | parse_qs(q)['tag'] | ["red", "blue"] | すべてリストで |
| Django | request.GET['tag'] | "blue" | 最後の値(getlistなら両方) |
| Node · Express 5 | req.query.tag | ["red", "blue"] | すべてリストで(既定のパーサーはquerystring) |
| Java Servlet | request.getParameter("tag") | "red" | 最初の値(getParameterValuesなら両方) |
| Go | r.URL.Query().Get("tag") | "red" | 最初の値 |
| ASP.NET Core | Request.Query["tag"] | "red,blue" | 文字列にするとカンマでつながる |
PHPは、名前に角かっこを付けた tag[]=red&tag[]=blue を配列として読み、名前の中のドットと空白をアンダースコアに置き換えます。そのため price.min=10000 は $_GET['price_min'] になり、別にある price_min の項目とぶつかることがあります。Pythonのparse_qsは既定で空の値を捨てるので、flag や empty= はキーすら残りません。残すには keep_blank_values=True を渡します。Goは ; や不正な % を含むペアを捨てます。ツール下部の「サーバーが読む値」は、選んだ項目でこの違いをその場で計算します。
値の中に別のURLを入れるとき
ログイン後の戻り先(redirect_uri・next・returnUrl)のように、URL全体を値として入れる場合は、内側のURLの ? & = # が外側のクエリの記号として読まれないよう、すべてエンコードする必要があります。エンコードせずに貼り付けると、内側のURLの & 以降が、外側の別の項目として分かれてしまいます。
| 入れ方 | 外側のURLが読む項目 |
|---|---|
そのまま貼る?next=https://shop.example.com/cart?item=12&size=L | next → https://shop.example.com/cart?item=12 size → L (分かれてしまう) |
エンコードして入れる?next=https%3A%2F%2Fshop.example.com%2Fcart%3Fitem%3D12%26size%3DL | next → https://shop.example.com/cart?item=12&size=L |
内側のURLにもエンコード済みの値があれば、もう一度エンコードされて %252F のように見えます。「表で開く」は、外側の値を1段階だけデコードした内側のURLを別の表で見せ、内側を直して「外側のURLへ」を押すと、再エンコードして入れ直します。例「ログイン遷移」の redirect_uri の中には、next=%2Fcart が1段階ぶん余計に入っています。
組み立て直すと変わる表記
クエリは、同じ内容を複数の表記で書けます。空白は + でも %20 でも、flag と flag= も、16進数の大文字 %E6 と小文字 %e6 も、すべて同じ値として読まれます。ほとんどのサーバーはこの違いを区別しませんが、署名付きURLは、署名したときと表記が変わると、サーバーによっては署名が合わなくなります。そのためこのツールは「元の表記を保持」を既定でオンにし、変更した項目だけを再エンコードします。
| 元の項目 | 元の表記を保持 | 保持オフ · 空白は + | 保持オフ · 空白は %20 |
|---|---|---|---|
q=red%20shoe | q=red%20shoe | q=red+shoe | q=red%20shoe |
flag | flag | flag= | flag= |
n=%e6%9d%b1 | n=%e6%9d%b1 | n=%E6%9D%B1 | n=%E6%9D%B1 |
t=~tilde | t=~tilde | t=%7Etilde | t=~tilde |
a=x;y | a=x;y | a=x%3By | a=x%3By |
空白を + にする規則はHTMLフォーム送信と URLSearchParams の方式で、%20 にする規則はJavaScriptの encodeURIComponent() の方式です。ブラウザーのURLSearchParamsは、項目を1つ削除しただけでも残りをすべて書き直すため、%20 が + に変わります(下のコード)。AWS S3の署名付きURL(X-Amz-Signature)やAzure StorageのSAS(sig)のように署名が付いたURLは、値を直さず、署名を取り直す必要があります。このツールは、署名項目のあるURLを変更すると警告を出します。
コードで行うとき
// JavaScript
const u = new URL('https://shop.example.com/p?color=white&color=black&q=red%20shoe&utm_source=newsletter');
u.searchParams.getAll('color'); // ['white', 'black']
u.searchParams.delete('utm_source');
u.toString(); // 'https://shop.example.com/p?color=white&color=black&q=red+shoe' (%20が+に変わる)
# Python
from urllib.parse import urlsplit, parse_qsl, urlencode, urlunsplit
s = urlsplit('https://shop.example.com/p?color=white&color=black&flag&utm_source=newsletter')
pairs = [(k, v) for k, v in parse_qsl(s.query, keep_blank_values=True) if not k.startswith('utm_')]
urlunsplit(s._replace(query=urlencode(pairs)))
# 'https://shop.example.com/p?color=white&color=black&flag=' (flagがflag=に変わる)
// PHP
parse_str('tag=red&tag=blue&size[]=S&size[]=M&price.min=10000', $q);
// $q = ['tag' => 'blue', 'size' => ['S', 'M'], 'price_min' => '10000']
http_build_query(['tag' => ['red', 'blue']]);
// 'tag%5B0%5D=red&tag%5B1%5D=blue'
3つの言語とも、解釈してから書き直す方式なので、元の表記は守られません。元の表記が重要なら、クエリ文字列から該当の断片だけを切り出してつなぎ直す必要があります。このツールの「元の表記を保持」はそのように動きます。
よくある間違い
- 値の欄に %20 を直接書く: 表の値はデコード済みの文字です。
%20と書くと、文字の %・2・0 とみなして%2520として出力します。空白は空白のまま書きます。 - C++ をそのままクエリに付ける:
lang=C++は、Cと空白2つとして読まれます。表の値欄に C++ と書けば、C%2B%2Bに変えて出力します。 - 同じ名前を誤りとみなして消す:
color=white&color=blackは、複数の値を選んだ絞り込みかもしれません。サーバーがどう読むかを先に確かめます。 - 空の値の項目を消す:
empty=やflagにも意味があることがあります。値がなくても、項目があるだけで機能を有効にするサーバーがあります。 - # 以降をクエリだと思い込む:
/page#tab?x=1のx=1はフラグメントの一部なのでサーバーへは届かず、このツールもフラグメントの欄に置きます。 - URLを値として入れるときにエンコードを忘れる: 内側のURLの
&が、外側の項目を2つに分けてしまいます。 - 署名付きURLの有効期限だけを延ばす:
X-Amz-Expiresを変えると署名が合わなくなり、リクエストが拒否されます。
限界
- クエリを
&だけで区切るURL標準の方式を使います。;や,で項目を区切るサイトや、パス内のパラメータ(/a;b=1/)は分解しません。 - 値はUTF-8としてだけ読んで表示します。Shift_JISのような古い文字コードの値は文字化けして見え、その項目を直すとUTF-8で再エンコードします。
- URLの前半(スキーム・ホスト・パス)と
#のフラグメントは、書かれた文字のまま扱い、エンコードや整形はしません。 - 「元の表記を保持」でも、項目を1つでも変えると、空の断片(
&&)と末尾の&は消えます。 - 計測パラメータは、公式ドキュメントで確認できた名前だけを表示します。一覧にない計測値は、自分で消す必要があります。
- サーバーが読む値は、各環境の既定の動作です。設定を変えたり別のパーサー(qs・Rackなど)を使ったりすると変わります。PHPの max_input_vars のような設定の上限は反映しません。
- URLへは接続しないため、そのURLが開けるか、安全かどうかは確認しません。
基準: クエリの解釈はURL標準(WHATWG)のapplication/x-www-form-urlencoded規則、計測パラメータは各社の公式ヘルプ、サーバーごとの動作はPHP 8.5・Python 3.14・Node.js 26の実行結果と、Java Servlet・Go・ASP.NET Core・Django・Express 5の公式ドキュメントで、2026年10月22日に確認しました。
出典
- 01WHATWG URL Standard: application/x-www-form-urlencoded&での分割、最初の =、+ → 空白、パーセントデコードとシリアライズ
- 02MDN: URLSearchParamsget・getAll・delete・toString
- 03Googleアナリティクス ヘルプ: カスタムURLでキャンペーンデータを収集するutmパラメータ9個の意味
- 04Google広告 ヘルプ: GoogleクリックID(GCLID)自動タグ付けが広告クリックごとに付ける値
- 05Google広告 ヘルプ: gbraid・wbraidiOSのコンバージョン計測用パラメータ
- 06Google広告 ヘルプ: gad_source・gad_campaignid広告の参照元とキャンペーン番号
- 07Googleタグ: クロスドメイン計測リンカーパラメータ _gl
- 08Meta: fbp・fbc パラメータリンクに付くクリックID(fbclid)
- 09広告・メール各社のドキュメント: dclid · srsltid · Microsoft クリックID · ttclid · twclid · li_fat_id · mc_cid・mc_eid · _hsenc・_hsmi · yclid · Matomo · NaPm各パラメータを付ける会社の公式説明
- 10PHP: Variables From External Sources名前の中のドットと空白をアンダースコアに置き換える規則、[] の配列
- 11Python: urllib.parse.parse_qskeep_blank_values の既定値は False、区切りは & だけ
- 12Django: QueryDict__getitem__ は最後の値、getlist はすべて
- 13Express 5: app settings (query parser)既定値 "simple" = Node の querystring
- 14Java EE: ServletRequest.getParameter値が複数なら getParameterValues の最初の値
- 15Go: net/urlValues.Get は最初の値、; を含むペアは不正なペア
- 16.NET: StringValues.ToString複数の値をカンマでつないだ文字列
- 17HTML 4.01 付録 B.2.2& のかわりに ; を受け付けるよう勧めた古い推奨
よくある質問
URLクエリ(クエリ文字列)とは何ですか?
URLの?から#の手前までの部分です。color=white&size=270のように「名前=値」を&でつなぎ、検索語・ページ番号・絞り込み条件・計測値など、ページへ付け足す情報をサーバーに渡します。各名前にどんな意味を持たせるかは、サイトごとに決まります。
?なしで name=kim&page=2 だけ入れても使えますか?
はい。URL全体、?で始まるクエリ、?のないクエリのどれでも受け付けます。URL全体を入れた場合は、URLの前半部分と#以降のフラグメントを別の欄に置き、組み立て直したURL全体またはクエリのみを選んでコピーできます。
計測パラメータを除いても、同じページが開きますか?
たいてい同じページが開きます。utmやgclidなどは、どこから来た訪問かを集計するための値だからです。ただし流入元によって案内やクーポンを変えるサイトもあるため、除いたURLで表示が違うときは元のURLを使ってください。クリックIDだけを除いてUTMを残すこともできます。
tag=red&tag=blue のように同じ名前が2回出ると、どの値が使われますか?
受け取るサーバーによって異なります。PHPとDjangoは最後の値blue、JavaScriptのget()・Java Servlet・Goは最初の値red、Pythonのparse_qsとExpress 5は2つの値のリスト、ASP.NET Coreはred,blueのようにカンマでつないで読みます。表で項目を選ぶと、ツール下部ですぐ比較できます。
q=red+shoe の+が、なぜ空白に見えるのですか?
クエリを読むフォーム規則では、+は空白を意味するためです。文字そのものの+は%2Bと書く必要があり、表の値の欄にC++と書くと、組み立て直したURLにはC%2B%2Bとして出力されます。
表を直したら %20 が + に変わりました。同じ値ですか?
クエリを読むとき、%20と+はどちらも空白なので同じ値です。このツールは「元の表記を保持」がオンなら、触れていない項目は元の文字のまま残し、変更した項目だけを選んだ規則(+または%20)でエンコードします。署名付きURLのように文字まで一致が必要な場合は、署名を取り直してください。
値の中に入っているURLは、どう編集しますか?
redirect_uriやnextのように値がURLなら、表示の列に「表で開く」が出ます。押すと内側のURLが別の表で開き、直したあとに「外側のURLへ」を押すと、内側のURLを再エンコードして外側の項目の値に入れます。
入力したURLはサーバーに送信されたり保存されたりしますか?
いいえ。表への分解、組み立て直し、計測値の表示、サーバーごとの読み方の計算は、すべてこのブラウザーの中で行います。入力したURLをサーバーへ送ることも、保存することも、ページのURLに残すこともなく、そのURLへ接続することもありません。