
GTMで「特定ページ」にだけ発火するトリガーを作る際、多くの方がURL系変数をお使いになってると思います。
ただURL系の変数と一口に言っても、「Page URL」変数に始まり、「Page Hostname」変数や「Page Path」変数など複数種類がありますよね。
実際のところ、やろうと思えば「Page URL」変数だけでも設定はできます。できますが、実はそうすると落とし穴があったり、問題なくやろうとすると正規表現が複雑になったりと、いろいろと問題がぽこぽこ出やすくなります。
しかしURL系の変数を適切に使い分けることができるとそんな問題も起こりにくく、設定もすっきりできたりするんです。
本記事は過去の「Googleタグマネージャで「特定のページ」を指定するルールの作り方」を今風に手直しした内容となっています。
トリガーの名称が旧称(ルール)にはなっていますが、具体的な条件の作り方は今でも参考にできるかと思います。
本記事とほぼ同内容の解説を、動画でもまとめています。テキストベースとは違ったインプットをされたい方は、こちらもご参考ください。
URLはけっこう可変でブレがある
なぜ「Page URL」変数だけで全部やろうとすると問題が起こりがちなのかというと、同じページであってもずばりURLはけっこうブレがあるからです。

URLはパーツとして、以下のように分けられます。
- プロトコル
- ホスト名(ドメイン名)
- パス(ディレクトリ)
- クエリパラメーター
- フラグメント(ハッシュタグ)
このうち、実は最後のフラグメント以外はどれもこれも、可変な要素を含んでいたりします。

- プロトコル
- https or http
(通信がSSLかどうかで「s」が付いたり付かなったりする) - ホスト名
- www.example.com or example.com
(ほとんどのサーバーでは「www.」の有無はどちらも同じページになる) - パス
- ディレクトリTOPの場合、末尾に「/」が付いたり付かなったり
- ディレクトリTOPの場合、末尾にファイル名(index.htmlなど)が付いたり付かなかったり
- クエリパラメーター
- クエリパラメーターが付いたり付かなかったり
(例:通常は無し、広告流入時は広告識別用IDパラメーターが付く) - クエリパラメーターが複数ある場合、順不同
(body=child&mind=adultとmind=adult&body=childはURLとしては同じクエリパラメーターとなる)
- クエリパラメーターが付いたり付かなかったり
そしてそんなブレがあるため、可変部分をうっかり忘れて条件を作ってしまうと、同じページなのにトリガーが反応しない、ってことが起こりえるんですね。
例えば「Page URL」変数で条件を作る際に「https://example.com/cat1/cat2/item123/」みたいなURLで条件を作ってしまうと、通信が非SSLでアクセスされた場合はhttpの末尾にsが付かなくなるため、「先頭が一致」や「含む」などで反応しなくなってしまいます。
URL系変数それぞれの取得範囲
GTMでURLをトリガー条件などにする際に使うのが、ページURLを取得するURL系の変数です。

「組み込み変数」であれば「ページ」グループにある「Page URL」、「Page Hostname」、「Page Path」変数が。
「ユーザー定義変数」であれば「ナビゲーション」グループにある「URL」がこれにあたりますね。
ユーザー定義変数の各要素タイプを例に、それぞれの変数がURLのどの範囲を取得するか、一覧にまとめてみました。

パーツ名 | 組み込み変数 | ユーザー定義変数 | 備考 |
---|---|---|---|
URL全部 | – | – | 実はJSを書いたりしないとGTMでは取得できない |
(フラグメントを除いた) URL全部 | Page URL | URL全体 | 実はフラグメントは含まれない |
プロトコルhttps | – | プロトコル | SSL通信かどうかで末尾のs有無が変わる |
ドメイン名www.example.com | Page Hostname | ホスト名 | ユーザー定義変数で登録する場合、「「www.」を削除」オプションでwww.だった場合にwww.を除去することが可能 |
ポート8080 | – | ポート | 通常は使われないので気にする必要なし (イントラネットサイトなどで利用してる場合がある) |
パス/dir1/dir2/page.html | Page Path | パス | 「デフォルトページ」オプションで、末尾が「index.html」などだった場合に除去することが可能 |
ファイルの拡張子html | – | ファイルの拡張子 | 「/」終わりの場合などは空欄が返る |
クエリパラメーターbody=child&mind=adult | – | クエリ | 頭の「?」は含まれないので注意 クエリがない場合、デフォルト値は空の文字列(”)が返る 「クエリキー」オプションを入力すると指定したクエリパラメーターの値だけを取得することが可能(「クエリキー」を指定すると、該当パラメーターがない場合はデフォルト値がundefinedになる) |
フラグメントblock1 | – | フラグメント |
まずはリダイレクトがあるかを事前チェック
では実際に変数の使い分け……をする前に、GTMでトリガーを設定したいサイトの設定を確認しておきましょう。
前述のとおりURLにはブレがありますが、アクセスした際にリダイレクトしてURLを直すことを行っているサイトも多く、もしそういった設定がされているサイトであればURLのブレを気にする必要がかなり減ります。
まず、設定したいサイトのURLをご用意ください。(例:https://ayudante.jp/)
そうしたら、下記のように書き換えたURLへ実際にブラウザでアクセスして、リダイレクトされるか確認してみましょう。それぞれのURLへアクセス後、アドレスバーをクリックして全文コピー&ペーストでテキストエディタなどへ貼り付けて、結果を見てみてください。

- 非SSLへアクセス(例:http://ayudante.jp/)
www.
を付けたドメイン名へアクセス(例:https://www.ayudante.jp/)- 稀に
www.
有る無しで別サブドメイン扱いとなる設定になっていることもあります。
その場合は別ページが表示されますので、ブレはない、と判断して良いでしょう。
- 稀に
- ディレクトリ末尾の「
/
」無しへアクセス(例:https://ayudante.jp) - ディレクトリ末尾に「
index.html
」などを付けてアクセス(例:https://ayudante.jp/index.html)- サイトによってデフォルトページは「
index.htm
」や「index.php
」、「index.jsp
」、「default.aspx
」などなど、「index.html
」以外のものになっている可能性もあります。もしエラーページが出たりなどして別ページが表示された場合は「それではなかった」ということなので、別のデフォルトページをお試しください。
仮に挙げた5種全部でエラーページになった、などであればレアケースでしょうから、ブレは考慮しなくてもよさそうです。
- サイトによってデフォルトページは「
もしサイトのサーバー側でリダイレクトの設定がされていれば、ブラウザのアドレスバーのURLが(書き換えたURLへアクセスしたのに)元のURL(例:https://ayudante.jp/)になっていると思います。
その場合は確認した箇所についてはURLのブレは発生しないということですので、トリガー条件設定時に考慮する必要がなくなります。
逆に(URLを書き換えて)アクセスしたURLのままだった、という場合は残念ですがリダイレクトは設定されていないようです。その場合はトリガー条件を作る際、忘れずにブレを吸収できるよう、条件を作っていきましょう。
URL系変数の具体的な使い分け方法
さて、トリガーで条件を作る際にURL系変数をどう使い分けていくのが良いかと言えば、シンプルに「各範囲毎に条件行(と変数)を分けて条件を作る」ことです(トリガーで条件を作る際、行が増えても「アンド条件(すべて満たさないとダメ)」になるので、行を分けても問題ありません)。
例えば、先に挙げた「https://example.com/cat1/cat2/item123/」を対象とした条件を作りたい場合。この時、プロトコルについては基本的にどちら(httpsでもhttpでも)であっても同じページですので、タグを出したいことがほとんどだと思います。ですので、プロトコルは不問とし、条件外にしたい箇所は条件から省きます。
すると残りは「example.com/cat1/cat2/item123/」になるので、これをURLのパーツに分解すると、下記がそれぞれの範囲になりますね。
example.com → 「Page Hostname」変数
/cat1/cat2/item123/ → 「Page Path」変数
あとはトリガーの条件にする際、それぞれ上記2変数で行を分けて設定すればOKです。
ひとまず例として、「www.
は無しへリダイレクトされる」「ディレクトリ末尾の/
無しは有りへリダイレクトされる」「デフォルトページ(index.html
)は無しへリダイレクトされる」設定になっている場合は、下記のようになります。

変数(と行)を分けることでどうなるかと言えば、以下のようなメリットがあります。
- 範囲外は考慮されない=範囲外でブレが発生しても大丈夫(例:
https
でもhttp
でもどちらでもOK) - ブレを考慮する必要がない(または少ない)ので、正規表現を使わなくても(または最低限の正規表現で)設定可能になる
もしこれを「Page URL」変数を使って1行で設定しようとすると、例えば下記のような正規表現を書く必要が出てきます。
^https?://example.com/cat1/cat2/item123/.* (「先頭が一致」の場合)
^https?://example.com/cat1/cat2/item123/(\?.*)?$ (「ディレクトリTOPだけ」にしたい場合)
正規表現を分かる人にとってはそんなに複雑なものではありませんが、少し含まれているだけでも、人によっては拒絶反応が出がちです。
またパッと見たときの可読性という意味でも避けられる正規表現はなるべく避けたいものですので、それを減らせるメリットはけっこう大きなものとなります。
特にクエリパラメーターの指定は気を付ける必要あり
前述したブレのうち、特に厄介なのが「クエリパラメーターの順不同ブレ」です。要は複数指定する際、または単独で指定する際などに並び順がランダムになることを想定する必要があるんですね。
たまに「Page URL」変数に対して「?body=child&mind=adult」を含む、みたいに設定されているケースを見かけますが、この並びであれば反応しても、「?mind=adult&body=child
」のように逆順になると(同じページなのに)反応しなくなります。
また「?body=child&konan=sinnichi&mind=adult
」のように条件外のクエリが間に追加された場合なども反応しなくなってしまいますね。
そのため、クエリパラメーターをURL条件として設定したい場合は、対象のクエリパラメーターごとに変数として登録して、パラメーターごとに行を分けてトリガー条件を作る必要があります。
例えばbody=child&mind=adult
というクエリパラメーターを条件にしたい場合は、以下のように設定します。
- ユーザー定義変数で「URL」変数を「要素タイプ:クエリ」、「クエリキー」へbodyと入力したものとmindと入力した変数をそれぞれ新規登録(計2変数)
- トリガー条件で1で登録した変数に対して行を分けて「{{body}} [等しい] [child]」と「{{mind}} [等しい] [adult]」のように設定


これをしないとどうなるかというと、正規表現でカバーするには複雑になりすぎる上に完璧な対応は不可能、という悲惨な状況になります。
また前述のとおり、クエリパラメーターには条件外の予期せぬパラメーターが追加される可能性もあります。
そのため、条件にしたいクエリパラメーターが1つしかない場合であっても、変数として登録して行を分けてトリガー条件を設定することをおススメします。
URLブレをカバーする正規表現の書き方
サイトでURLのリダイレクトがサーバー設定されていない場合は、残念ですが正規表現が必要になってきます。
先に挙げたURLのブレを吸収する正規表現もまとめておきますので、リダイレクトがされない場合は参考にしてみてください。
なお繰り返しとなりますが前提として、実際にアクセスしてみて表示されるページ内容が変わるのであれば別ページですので、「同じページのURLブレ」ではありません。
その場合はリダイレクトがされなかったとしても、その場合もブレは気にする必要はないでしょう。
項目 | 対象変数 | 正規表現サンプル | 備考 |
---|---|---|---|
プロトコル末尾のs有無 | {{Page URL}} | ^https?://~~ | どちらであっても対象にしたいでしょうから、基本的には条件にする必要がなく、条件行として設定しないほうがシンプルです。 |
ドメイン名のwww.有無 | {{Page Hostname}} | ^(www\.)?~~ | |
ディレクトリ末尾の/有無 | {{Page Path}} | ~~/?$ | |
ディレクトリ末尾のデフォルトページ有無 | {{Page Path}} | ~~/(index\.html?|index\.php|index\.jsp|default\.aspx)?$ |
- 正規表現の各記号の意味
-
^
= 「先頭」()
= 囲った範囲をグループ化|
= グループ内でOR条件(例:(A|B|C)であれば「AかBかC」の意)\.
= 「.」という記号(正規表現において「.
」は「なんでもいいから1文字」という意味になるため、「.」を示したい場合は「\.
」と書く)?
= 「直前の文字やグループ」があってもなくても$
= 「末尾」
まとめ
今回取り上げたURL系変数ですが、GTMを触る人であればほとんどの方が触ったことのあるものだと思います。
特に「Page URL」変数さんは、それこそ皆さまお世話になってるのではないかと。とても便利。実際に、「Page URL」変数さんでなければ設定できないような条件が出てくることも、経験あるのではないでしょうか。
ただ「Page URL」変数以外にもURLを扱う変数はあります。そして使い分けることでより適切に設定ができるようになりますので、あまり意識されていない方はぜひこの機会に手を出してみてはいかがでしょうか。
URL条件を作る際に最初から「Page URL」変数で思考スタートするのではなく、より小範囲の変数でできないか、を考えるところから始めていただければな、と思います。