Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

PAC ファイルのベストプラクティス

最終更新 Markdown で表示Agent セットアップ

PAC ファイルは、どのトラフィックをプロキシサーバーへリダイレクトするかを指定するテキストファイルです。ブラウザーが Web リクエストを行うと、PAC ファイルの FindProxyForURL() 関数を参照します。この関数がリクエストを評価し、直接接続、プロキシサーバー、フェイルオーバー順序などのルーティング指示を返します。

PAC ファイルの形式

デフォルトの Cloudflare PAC ファイルは、次の標準形式に従います。

default-pac.jsjs
function FindProxyForURL(url, host) {
	// No proxy for private (RFC 1918) IP addresses (intranet sites)
	if (
		isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
		isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
		isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0")
	) {
		return "DIRECT";
	}

	// No proxy for localhost
	if (isInNet(dnsResolve(host), "127.0.0.0", "255.0.0.0")) {
		return "DIRECT";
	}

	// Proxy all
	return "HTTPS 3ele0ss56t.proxy.cloudflare-gateway.com:443";
}

PAC ファイルは カスタマイズ し、ブラウザーがアクセスできる場所にホストできます。

書式の注意点

  • エンドポイントに使うディレクティブは PROXY ではなく HTTPS にしてください。例:
    • 正しい例: return "HTTPS your-subdomain.proxy.cloudflare-gateway.com:443";
    • 誤った例: return "PROXY your-subdomain.proxy.cloudflare-gateway.com:443";
  • ブラウザーのプロキシ設定にエンドポイントを直接指定するのではなく、PAC ファイルを使う必要があります。最近のブラウザーは、PAC ファイルなしの HTTPS プロキシに対応していません。
  • 余分な文字が入らないよう、VS Code などのプレーンテキストエディターを使ってください。
  • 内部サービスだけでなく公開インターネットの閲覧に PAC ファイルを使う場合は、サイトの機能障害を防ぐためにプロキシから除外する必要があるドメインについて、よくあるバイパスルール を参照してください。

アイデンティティプロバイダーをバイパスする PAC ファイルのテンプレート

認可エンドポイント を使う場合は、PAC ファイルでアイデンティティプロバイダー(IdP)のドメインをバイパスする必要があります。これを行わないと、IdP で認証する前にブラウザーがプロキシ認証を試み、認証ループが発生します。

次の PAC ファイルは、よく使う IdP バイパスルールを含む包括的なテンプレートです。プレースホルダーはご自身の設定に置き換えてください。

pac-idp-template.jsjs
function FindProxyForURL(url, host) {
	// *** Identity Provider Bypass ***
	// CRITICAL: Bypass your IdP to prevent authentication loops
	// Uncomment and configure the section for your IdP:

	// Okta
	// if (host === "your-domain.okta.com" || shExpMatch(host, "*.oktacdn.com")) {
	// 	return "DIRECT";
	// }

	// Microsoft Entra ID (Azure AD)
	// if (
	// 	host === "login.microsoftonline.com" ||
	// 	host === "aadcdn.msauth.net" ||
	// 	host === "aadcdn.msftauth.net"
	// ) {
	// 	return "DIRECT";
	// }

	// Google Workspace
	// if (
	// 	host === "accounts.google.com" ||
	// 	shExpMatch(host, "*.gstatic.com")
	// ) {
	// 	return "DIRECT";
	// }

	// GitHub
	// if (shExpMatch(host, "*.github.com")) {
	// 	return "DIRECT";
	// }

	// *** Private Networks ***
	// Bypass private RFC 1918 IP addresses
	if (
		isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
		isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
		isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0")
	) {
		return "DIRECT";
	}

	// Bypass localhost
	if (isInNet(dnsResolve(host), "127.0.0.0", "255.0.0.0")) {
		return "DIRECT";
	}

	// Bypass plain hostnames (no dots)
	if (isPlainHostName(host)) {
		return "DIRECT";
	}

	// Bypass .local domains
	if (shExpMatch(host, "*.local")) {
		return "DIRECT";
	}

	// *** Cloudflare Access Logout ***
	// Optional: Redirect logout requests to your Access logout page
	// if (shExpMatch(url, "*logout*")) {
	// 	return "HTTPS your-team-name.cloudflareaccess.com/cdn-cgi/access/logout";
	// }

	// *** Proxy all other traffic ***
	return "HTTPS your-subdomain.proxy.cloudflare-gateway.com:443";
}

性能の最適化

ブラウザーはリクエストごとに PAC ファイルを評価します。ユーザーの Web 閲覧で遅延や問題が起きないよう、PAC ファイルの性能最適化は重要です。

DNS 結果を変数にキャッシュする

dnsResolve() で DNS 解決を行うときは、結果を変数に保存し、複数のチェックで再利用してください。冗長な DNS ルックアップを避けられます。

function FindProxyForURL(url, host) {
	// Resolve once and reuse
	var hostIP = dnsResolve(host);

	if (isInNet(hostIP, "10.0.0.0", "255.0.0.0")) {
		return "DIRECT";
	}

	// Reuse hostIP for additional checks
	if (isInNet(hostIP, "172.16.0.0", "255.240.0.0")) {
		return "DIRECT";
	}

	return "HTTPS proxy.example.com:443";
}

プレーンなホスト名を先に確認する

NetBIOS 名(ピリオドを含まないホスト名)は通常内部向けであり、プロキシをバイパスする必要があります。これらを最初に確認してください。

if (isPlainHostName(host)) return "DIRECT";

高度な手法

大文字と小文字の扱い

JavaScript は大文字と小文字を区別します。一致判定を安定させるため、ホスト名を小文字に変換してください。

function FindProxyForURL(url, host) {
	// Normalize to lowercase
	host = host.toLowerCase();
	url = url.toLowerCase();

	if (shExpMatch(host, "*.example.com")) {
		return "DIRECT";
	}

	return "HTTPS proxy.cloudflare-gateway.com:443";
}

よくあるバイパスルール

内部サービスだけでなく公開インターネットの閲覧に PAC ファイルを使う場合、サイトの機能障害を防ぐために、特定ドメインでプロキシをバイパスする必要があることがあります。次は、プロキシがトラフィックに干渉しやすい一般的なケースです。

フォントと静的アセットのプロバイダー

フォント API と静的アセットのプロバイダーは、レンダリングの問題を防ぐために、通常はプロキシをバイパスします。

// Bypass font providers
if (
	shExpMatch(host, "*.googleapis.com") ||
	shExpMatch(host, "*.gstatic.com") ||
	shExpMatch(host, "fonts.adobe.com")
) {
	return "DIRECT";
}

ストリーミングとメディアサービス

動画ストリーミングや大きなメディアダウンロードは、直接接続の方が性能が良い場合があります。

// Bypass streaming services
if (
	shExpMatch(host, "*.netflix.com") ||
	shExpMatch(host, "*.youtube.com") ||
	shExpMatch(host, "*.googlevideo.com")
) {
	return "DIRECT";
}

証明書ピンニングを使うアプリ

HTTPS 検査が有効な場合、証明書ピンニングを使うアプリケーションやサービスは、Cloudflare が挿入した証明書を拒否し、プロキシ経由だと読み込みに失敗します。PAC ファイルでこれらのドメインをバイパスしてください。

// Bypass certificate-pinned apps
if (
	shExpMatch(host, "*.example-bank.com") ||
	shExpMatch(host, "*.example-pinned-app.com")
) {
	return "DIRECT";
}

Do Not Inspect(DNI)ポリシー では、これらの接続の証明書ピンニングエラーは防げません。証明書ピンニングを使うアプリは、PAC ファイルでのバイパスが必要です。

PAC ファイルをテストする

想定する Web サイトでテストする

組織の全ユーザーへ PAC ファイルを展開する前に、ユーザーがよく使う Web サイトとアプリケーションでテストしてください。次の点を確認できます。

  • 内部リソースにアクセスでき、誤ってプロキシ経由になっていないこと
  • 外部サイトが Gateway 経由で適切にフィルタリングされていること
  • 一般的な利用パターンで性能が許容範囲であること

構文を検証する

PAC ファイルは JavaScript 構文を使います。閉じ括弧 ) やブラケット ] の欠落など、1 つの構文エラーで PAC ファイル全体が失敗します。展開前に、JavaScript 対応のテキストエディターで構文エラーを見つけて修正してください。

設定のトラブルシューティング

PAC ファイルのルーティング判定をデバッグする

プロキシのルーティングに問題がある場合、ほとんどのブラウザーには PAC ファイルの動作を確認するデバッグツールがあります。

Chromium 系ブラウザー(Chrome、Edge、Brave)

  1. ブラウザーで chrome://net-export/(または edge://net-export/)を開きます。
  2. Start Logging to Disk を選びます。
  3. 問題のあるブラウザーで、テスト対象の Web サイトを開きます。
  4. Stop Logging を選びます。
  5. ダウンロードしたファイルを netlog-viewer で開きます。
  6. ドメインを検索し、プロキシ解決の判定を確認します。

Firefox

  1. Firefox で Tools > Browser Tools > Browser Console を開きます。
  2. 問題のあるブラウザーで、テスト対象の Web サイトを開きます。
  3. プロキシ解決に関するメッセージを確認します。

Safari

  1. Safari で Safari > Settings を開き、Advanced を選びます。
  2. Show Develop menu in menu bar をオンにします。
  3. Develop > Show Web Inspector を選びます。
  4. Network タブを開きます。
  5. リクエストの詳細を確認し、プロキシの使用状況を検証します。

PAC ファイルを使うデバイスで閲覧が遅い

PAC ファイル内の過剰な DNS ルックアップが遅延の原因になることがあります。PAC ファイルを見直し、dnsResolve()isInNet()isResolvable() の使用を最小限にしてください。

ブラウザーが PAC ファイルを誤ってキャッシュする

PAC ファイルを更新しても、ブラウザーがキャッシュ済みの版を使い続け、想定外の動作になることがあります。最新版を使うため、PAC ファイル更新後はブラウザーのキャッシュを消去し、ブラウザーを再起動してください。

役に立ちましたか?