DNSブロックしているアド/アフィリエイトリンク(hb.afl.rakuten.co.jp など)を、
一時的に開きたいときのための302リダイレクト解決アプリ。
URLを渡すと、そのURLへリクエストして最終的な着地先URL(実際の商品ページなど)まで リダイレクトを複数ホップたどり、ブラウザをそこへ直接ジャンプさせる。DNSブロックしている 中間ドメインへのアクセスはサーバー側(Cloudflare/自宅サーバー)から行うため、ローカルの DNSブロックの影響を受けない。
着地後のURLからは utm_* や gclid / fbclid / 楽天・A8.net等のアフィリエイト
クリックIDといった、成果報酬の紐づけにのみ使われるパラメータを自動で除去してから
リダイレクトする(先方の広告主・ASPに成果を発生させない)。
また、URL中に pc= などのパラメータとして遷移先の完全なURLが既に埋め込まれている
場合(楽天のアフィリエイトリンク等でよくある)は、ASPサーバーへの通信自体を省略して
そこから直接たどる。応答が遅いASPサーバーを経由しなくなるため高速化でき、そもそも
ASP側にアクセスしないので成果が発生する余地もなくなる。
実際のドメイン名が入る以下の2ファイルはgit管理対象外(
cp worker/wrangler.toml.example worker/wrangler.toml
cp docker/Caddyfile.example docker/Caddyfileコピー後、ln.example.com / ad.example.com の部分を実際に使うドメインへ置き換える。
2通りの入力方法に対応。以下は例として ln.example.com / ad.example.com を使う場合。
-
フォーム入力:
https://ln.example.com/を開き、入力欄にURLを貼り付けて送信 -
URL追記方式:
https://ad.example.com/の後ろに直接ターゲットURLを付ける (http:///https://は省略可。ただしxxx.xxx/...のようにドット区切りの ドメイン形式+スラッシュで始まる必要がある。それ以外のパス、例えば bot/クローラーが探索してくる/assets/js/auth.jsのようなものは404を返す)https://ad.example.com/https://hb.afl.rakuten.co.jp/hgc/xxxxx/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fxxxx https://ad.example.com/hb.afl.rakuten.co.jp/hgc/xxxxx/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fxxxxまたは
?url=クエリパラメータでも可(URLエンコード推奨)https://ad.example.com/?url=https%3A%2F%2Fhb.afl.rakuten.co.jp%2F...
ln.example.com と ad.example.com はどちらも同じアプリで、動作は同一(用途別に使い分けるための
2つのホスト名)。
worker/— Cloudflare Workers版(推奨・無料・サーバーレス)wrangler.toml.example— サンプル設定(git管理対象)wrangler.toml— 実際のドメインを書いた実運用設定(git管理対象外、初回コピーで作成)
docker/— 自宅サーバー等でセルフホストする場合のDocker版Caddyfile.example— サンプル設定(git管理対象)Caddyfile— 実際のドメインを書いた実運用設定(git管理対象外、初回コピーで作成)
どちらも同じロジック(最大10ホップまでリダイレクトを追跡、8秒タイムアウト、 プライベートIP/localhostへのアクセスはSSRF対策としてブロック、着地URLからトラッキング/ アフィリエイトパラメータを除去)。
worker/src/index.js と docker/server.js それぞれの EMBEDDED_URL_PARAM_PRIORITY に
優先度順で定義。以下のいずれかのクエリパラメータに http(s):// から始まる値があれば、
ASPサーバーへは通信せずそこから直接たどる。
url, u, dest, destination, redirect_url, redirect, redir, target, goto, link, pc, m
pc / m は楽天afl系リンクのPC/モバイル向け遷移先パラメータ。誤検出が心配な場合や
新しいASPの埋め込みパラメータ名を追加したい場合は、このリストを編集する
(worker版とdocker版の両方に同じ内容を反映すること)。埋め込みURLが見つからない場合は
従来通りリダイレクトチェーンを実際にたどって解決する。
worker/src/index.js と docker/server.js それぞれの TRACKING_PARAM_EXACT に定義。
utm_で始まるもの全て(完全一致ではなくプレフィックス一致)- 広告クリックID:
gclid,gclsrc,dclid,gbraid,wbraid,fbclid,igshid,ttclid,twclid,msclkid,yclid - メール/CRM系:
mc_cid,mc_eid,_hsenc,_hsmi,hsctatracking - リファラ系:
ref,ref_src,ref_url,referrer,spm,scm - ASP/アフィリエイト系:
a8mat,a8ejp,a8sub(A8.net)、scid,sc_i,sc_e_p,s_pn(楽天)、vc_url(バリューコマース)、banner_id,adid
新しいASPのパラメータを追加したくなったら、このSetに項目を足すだけでよい (worker版とdocker版の両方に同じ内容を反映すること)。
前提: 使用するドメインがCloudflareで管理されているゾーンであること。
worker/wrangler.toml が未作成なら、先に「セットアップ」の手順でコピー・編集しておく。
cd worker
npm install
npx wrangler login
npx wrangler deployデプロイ後、Cloudflareダッシュボード → 対象Worker → Settings > Domains & Routes から実際のドメインをカスタムドメインとして追加する(Freeプランで問題なく利用可能)。
wrangler.toml に記載した routes 設定でCLIから追加することも可能。
ローカル動作確認:
npm run dev
# http://localhost:8787/ で動作確認docker/Caddyfile が未作成なら、先に「セットアップ」の手順でコピー・編集しておく。
cd docker
docker compose up -d --builddocker-compose.ymlはlink-unblockerコンテナ(本体)とcaddy(リバースプロキシ + Let's Encrypt自動TLS)の2サービス構成- 事前に使用するドメインのA/AAAAレコードを自宅のグローバルIPに向けておくこと (ルーターで80/443番ポートを転送)
単体のコンテナだけ動かしたい場合(TLS終端を別途持っている場合など):
cd docker
docker build -t link-unblocker .
docker run -d -p 8080:8080 --name link-unblocker link-unblocker- 公開URLとして稼働させるため、任意のURLへのアクセスを許可する簡易プロキシになる。 プライベートIP/localhostへのアクセスは既にブロック済みだが、悪用が気になる場合は Cloudflare Access等でBasic認証をかけることを推奨
- リダイレクト先がJavaScriptによるクライアントサイドリダイレクト(meta refreshやJS)の 場合は解決できない(HTTPレベルの3xxリダイレクトのみ対応)
- トラッキングパラメータの除去は着地後の最終URLに対してのみ行う(リダイレクトの途中経路の URLは、必要な追跡パラメータをASP側が要求しているケースがあるため変更しない)
/favicon.icoと/robots.txtは専用レスポンスを即座に返す- パス連結方式は「
http(s)://で始まる」か「xxx.xxx/...のようなドメイン形式 (ドット区切り + スラッシュ)で始まる」場合のみターゲットURLとして扱う。/assets/js/auth.jsや/bot-connect.jsのような、bot/クローラーが探索してくる 無関係なパスは404を返す(外部への無駄なfetchをせず、ログに無関係なリクエストが 積み上がるのを防ぐ)