Skip to content

Instantly share code, notes, and snippets.

@tksugimoto
Last active May 7, 2024 05:29
Show Gist options
  • Save tksugimoto/e9f840128c2de72a3656c3931b0aaccf to your computer and use it in GitHub Desktop.
Save tksugimoto/e9f840128c2de72a3656c3931b0aaccf to your computer and use it in GitHub Desktop.
Chromeで名前解決をoverride (/etc/hosts 相当)

Chromeアプリから hosts ファイルを操作

Chrome拡張でリダイレクトした後にHostヘッダーを書き換え

特徴

  • ブラウザ上での hostname 表示は変更後の値
    • リダイレクトを使用するため
    • history.replaceState は異なるオリジンを指定できないので上書きには使用できなかった
  • 暗号化通信は非対応
    • SSL/TLSハンドシェイクのときにホスト名が送信されるため
    • (大丈夫な場合もあるかも?少なくとも Server Name Indication を使用している場合はNG)

方法

  1. chrome.webRequest.onBeforeSendHeaders.addListener() でリダイレクト
  2. chrome.webRequest.onBeforeRequest.addListener() でホストヘッダーを書き換え(追加)

Chrome拡張で proxy.pac を動的生成してtargetサーバーへproxyする

特徴

  • トリッキー
  • 暗号化通信は非対応
    • GET メソッドではなく CONNECT でリクエストされるため。通常、Webサーバーは CONNECT リクエストを受け付けない

方法

	if (host === "example.com") {
		return "PROXY localhost:1024";
	}

通常のHTTPリクエスト

GET / HTTP/1.1
Host: example.com

proxyとした場合のHTTPリクエスト(http)

GET http://example.com/ HTTP/1.1
Host: example.com

proxyとした場合のHTTPリクエスト(https)

CONNECT example.com:443 HTTP/1.1
Host: example.com:443

番外:Chrome拡張の content_script で <a>, <img> などのURLを書き換える

特徴

  • 名前解決ではない

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment