広告ブロッカーの仕組みと選び方 — フィルタは何をしているのか

広告ブロッカーは「広告を消すもの」と一括りにされがちですが、実際には通信そのものを止める層残った見た目を隠す層の2つが組み合わさって動いています。この2層を分けて理解すると、フィルタの書き方も、拡張機能・DNS・端末アプリの向き不向きも、そのまま説明が付きます。この記事では記法の読み方から選び方までを順に整理します。

2つの層に分かれている

1つめはネットワーク層です。ページが読み込もうとしたアドレスを見て、広告配信や計測に使われるものへの通信を止めます。止まれば、そもそも画像もスクリプトも取得されません。通信量が減り、追跡用のスクリプトも動かないので、効き方としてはこちらが本体です。

2つめは表示層です。ネットワーク層で止めきれなかったもの、あるいは止めた結果として空の枠だけが残った場所を、CSS で隠します。広告が本文と同じドメインから配信されている場合は通信を止められない(止めると本文まで消える)ため、この層が受け持ちます。

フィルタの記法も、この2つにそのまま対応しています。

// ネットワーク層: ads.example.com とそのサブドメイン宛の通信を、別ドメインからの読み込みのときだけ止める
||ads.example.com^$third-party

// 表示層: news.example.jp で、class="ad-banner" の要素を隠す
news.example.jp##.ad-banner

記号の意味

Adblock 形式と呼ばれるこの記法は、uBlock Origin・AdGuard・Adblock Plus でおおむね共通です。よく出てくる記号は多くありません。

記号意味
||ドメインの先頭に一致(サブドメインも含む)||ads.example.com^
^区切り文字(/ ? : など)または末尾||example.com^
*任意の文字列/banner-*.gif
@@例外(このルールに当たるものはブロックしない)@@||example.jp/assets/*
$以降は条件の指定$third-party,script
##要素を隠す(後ろは CSS セレクタ)example.com##.ad
#@#隠すルールの打ち消しexample.com#@#.ad
!コメント行! 自分用のメモ

とくに ^ の有無は効き方が変わります。||ads.example.com と書くと「この文字列で始まるドメイン」に当たるため、ads.example.com.evil.net のような似せた名前まで巻き込みます。ドメインをそこで終わらせたいときは ||ads.example.com^ と書きます。

条件(オプション)は「いつ止めるか」を絞るためのものです。 $third-party は「別ドメインから読み込まれたときだけ」、$script は「スクリプトのときだけ」、 $domain=example.com は「そのページを開いているときだけ」。 条件を付けずに広いパターンを書くと、必要な通信まで巻き込みます。

どこで動かすかで、できることが変わる

方式効く範囲できること限界
ブラウザ拡張そのブラウザの中だけ通信の遮断と要素の非表示の両方。ページの中身が見えるので細かく効く他のアプリには効かない。拡張の仕組みの制約を受ける
DNSブロック端末やルーター単位で全アプリ設定が1か所で済み、アプリ内の広告にも効くドメイン単位でしか止められない。要素は隠せない
端末アプリ(VPN型など)端末全体アプリをまたいで効く通信を仲介するため、提供元の信頼性が選定の中心になる

DNSブロックの限界は誤解されやすい点です。止められるのはドメイン単位なので、広告が本文と同じドメインから配信されていれば止めようがありません。逆に止めると本文まで消えます。「拡張では消えるのに DNS では消えない」広告があるのは、たいていこの理由です。

ブラウザ拡張については、拡張機能の仕組み(Manifest)の世代交代により、従来のように拡張自身が通信を1件ずつ判断して止める方式から、あらかじめ宣言したルール表をブラウザ側に渡して処理させる方式へ移行が進んでいます。宣言型はブラウザが処理するぶん速く、拡張から通信の中身が見えない設計ですが、ルールの数や書ける条件に上限が入ります。お使いのブラウザと拡張が今どちらの方式で動いているかは、拡張の配布ページやドキュメントで確認してください。

書き間違いは静かにページを壊す

フィルタは間違っていてもエラーになりません。当たらないだけ、あるいは当たりすぎるだけで、どちらも気付きにくい形で表に出ます。よくある3つを、当社のフィルタ構文チェッカーに通した出力で示します。

この記事の出力について: 以下は 2026年8月17日に、フィルタ構文チェッカーの「ありがちな書き間違い」の例をそのまま読み込ませて得た表示です。同じ手順で再現できます。
// 入力
*
http://ads.example.com/
||ads.example.com
##div

// 出力(要約)
* … 注意: すべての通信に一致します。ほぼ確実にページが壊れます。
http://ads.example.com/ … 注意: http:// から書くと https:// のときに当たりません。
||ads.example.com … 注意: 末尾に ^ が無いため、似た名前のドメインにも当たることがあります。
##div … 注意: ドメインを指定せずタグ名だけを隠すと、すべてのサイトでその要素が消えます。

いずれも文法としては正しいため、拡張機能は黙って受け付けます。自分で書いたフィルタが意図どおりかを確かめたいときは、行の意味を日本語に言い直して読み返すのが確実です。

Free tool
フィルタ構文チェッカー
書いたフィルタが何をブロックする行なのかを日本語で説明し、書き間違いを指摘します。URL を入れて一致するルールも確認できます。ブラウザ内で完結し、入力は送信しません。

選び方の目安

サイトを運営する側から見ると

広告ブロッカーの普及は、広告収入で運営されているサイトにとっては収入の減少に直結します。一方で、読者側が自分の端末の見え方を選ぶこと自体は一般に問題になりません。現実的な着地点は、読者が「このサイトは許可する」と判断できる状態を作ることです。表示を重くしない、追跡を減らす、支援の手段を用意するといった打ち手は、いずれも許可リストに入れてもらう確率を上げます。

また、計測タグをページの表示に必須の処理と絡めてしまうと、ブロックされた瞬間にページ自体が動かなくなります。計測は失敗しても本文が読める作りにしておくことが、結果的にブロック環境での体験を守ります。

よくある質問(FAQ)

広告ブロッカーは具体的に何をしているのですか?

大きく2つの層で動いています。1つはネットワーク層で、広告や計測用のアドレスへの通信そのものを止めます。もう1つは表示層で、止められなかった要素や枠だけが残った箇所を CSS で隠します。フィルタの記法もこの2種類に対応していて、||example.com^ のような行はネットワーク層、example.com##.ad-banner のような行は表示層のルールです。両方が組み合わさって「広告が消えたように見える」状態になります。

拡張機能・DNSブロック・端末アプリのどれを選べばよいですか?

止められる範囲と細かさが違います。ブラウザ拡張はページの中身まで見えるので要素単位で隠せますが、そのブラウザの中でしか効きません。DNSブロックは端末やルーター単位で全アプリに効く代わりに、ドメイン単位でしか止められず、同じドメインから配信される本文まで巻き込むと何も表示されなくなります。端末アプリ(VPN型など)は範囲が広い一方で、通信を仲介する仕組み上、提供元をどこまで信頼できるかが選定の中心になります。

フィルタの書き間違いで何が起きますか?

必要なページまで壊れます。よくあるのは、||example.com のように末尾の ^ を省いて似た名前のドメインまで巻き込む形、http:// から書いて https:// の通信に当たらない形、##div のようにドメインを指定せずタグ名だけを隠して全サイトで要素が消える形です。当社のフィルタ構文チェッカーは、この3つを含む代表的な誤りをその場で指摘します。

広告ブロッカーを使うのは問題ないのでしょうか?

自分の端末で見え方を変えること自体は一般に問題になりませんが、広告収入で運営されているサイトの収入を細らせる面はあります。読み続けたいサイトは許可リストに入れる、支援の仕組みがあれば利用する、といった使い分けが現実的です。技術面では、フィルタが増えるほどページ表示のたびに照合処理が走るため、闇雲にリストを足すと逆に体感が重くなる点にも注意してください。

← 技術ブログ一覧へ戻る