PAC ファイルは、どのトラフィックをプロキシサーバーへリダイレクトするかを指定するテキストファイルです。ブラウザーが Web リクエストを行うと、PAC ファイルの FindProxyForURL() 関数を参照します。この関数がリクエストを評価し、直接接続、プロキシサーバー、フェイルオーバー順序などのルーティング指示を返します。
デフォルトの Cloudflare PAC ファイルは、次の標準形式に従います。
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 ファイルでアイデンティティプロバイダー(IdP)のドメインをバイパスする必要があります。これを行わないと、IdP で認証する前にブラウザーがプロキシ認証を試み、認証ループが発生します。
次の PAC ファイルは、よく使う IdP バイパスルールを含む包括的なテンプレートです。プレースホルダーはご自身の設定に置き換えてください。
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 ファイルの性能最適化は重要です。
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 サイトとアプリケーションでテストしてください。次の点を確認できます。
- 内部リソースにアクセスでき、誤ってプロキシ経由になっていないこと
- 外部サイトが Gateway 経由で適切にフィルタリングされていること
- 一般的な利用パターンで性能が許容範囲であること
PAC ファイルは JavaScript 構文を使います。閉じ括弧 ) やブラケット ] の欠落など、1 つの構文エラーで PAC ファイル全体が失敗します。展開前に、JavaScript 対応のテキストエディターで構文エラーを見つけて修正してください。
プロキシのルーティングに問題がある場合、ほとんどのブラウザーには PAC ファイルの動作を確認するデバッグツールがあります。
Chromium 系ブラウザー(Chrome、Edge、Brave)
- ブラウザーで
chrome://net-export/(またはedge://net-export/)を開きます。 - Start Logging to Disk を選びます。
- 問題のあるブラウザーで、テスト対象の Web サイトを開きます。
- Stop Logging を選びます。
- ダウンロードしたファイルを netlog-viewer ↗ で開きます。
- ドメインを検索し、プロキシ解決の判定を確認します。
Firefox
- Firefox で Tools > Browser Tools > Browser Console を開きます。
- 問題のあるブラウザーで、テスト対象の Web サイトを開きます。
- プロキシ解決に関するメッセージを確認します。
Safari
- Safari で Safari > Settings を開き、Advanced を選びます。
- Show Develop menu in menu bar をオンにします。
- Develop > Show Web Inspector を選びます。
- Network タブを開きます。
- リクエストの詳細を確認し、プロキシの使用状況を検証します。
PAC ファイル内の過剰な DNS ルックアップが遅延の原因になることがあります。PAC ファイルを見直し、dnsResolve()、isInNet()、isResolvable() の使用を最小限にしてください。
PAC ファイルを更新しても、ブラウザーがキャッシュ済みの版を使い続け、想定外の動作になることがあります。最新版を使うため、PAC ファイル更新後はブラウザーのキャッシュを消去し、ブラウザーを再起動してください。