Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】CURLOPT_NOPROXY定数の使い方

CURLOPT_NOPROXY定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

CURLOPT_NOPROXY定数は、PHPのcURL拡張機能において、プロキシサーバを経由せずに直接接続を行うべきホストを指定するための定数です。システム開発において、インターネットへのアクセスはセキュリティやネットワーク制御の目的でプロキシサーバを経由させることがよくあります。しかし、すべての通信をプロキシ経由にするのではなく、特定の宛先に対しては直接接続を必要とするケースも存在します。このCURLOPT_NOPROXY定数は、まさにそのような状況で利用され、特定の宛先ホストへの通信時にのみプロキシの設定を無効化し、直接インターネットへの接続を試みることを可能にします。

cURLのオプションとして設定する際には、この定数をキーとして使用し、その値にはプロキシを使用しないホスト名やIPアドレス、またはサブネットのリストを文字列形式で渡します。複数の宛先を指定する際は、カンマ(,)で区切って記述します。例えば、「example.com,localhost,192.168.0.0/16」のように設定することで、これら指定されたドメインやIP範囲へのリクエストでは、CURLOPT_PROXYなどで設定されたプロキシが無視され、直接通信が行われます。

この機能は、社内ネットワーク内のサーバへのアクセスや、特定の外部サービスとの連携において、プロキシを経由させたくない、あるいは経由できないといった要件がある場合に非常に重要です。プロキシの有無に関わらず、柔軟かつ効率的なネットワークアクセス制御をPHPアプリケーションで実現するための、重要な設定オプションの一つと言えます。特に、既存のプロキシ設定が存在する環境で、一部の通信だけを除外したい場合にこの定数が活躍します。

構文(syntax)

1<?php
2$ch = curl_init();
3curl_setopt($ch, CURLOPT_NOPROXY, 'localhost,127.0.0.1');
4curl_close($ch);

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

CURLOPT_NOPROXY は、プロキシサーバーを経由しないように指定するための定数です。この定数を CURLOPT_PROXY を使用する際に指定すると、プロキシ設定が無効になります。

サンプルコード

PHP cURLでプロキシバイパス設定する

1<?php
2
3/**
4 * プロキシ設定と、プロキシをバイパスするホストを指定してcURLリクエストを実行します。
5 *
6 * この関数は、CURLOPT_PROXYで指定されたプロキシを介して通信を行いますが、
7 * CURLOPT_NOPROXYに指定されたホスト名に対してはプロキシをバイパスし、
8 * 直接アクセスを試みるcURLリクエストの例を示します。
9 *
10 * CURLOPT_NOPROXYは、プロキシ経由でアクセスしたくない特定のホストを
11 * カンマ区切りで指定するために使用するcURLオプションです。
12 *
13 * @param string $url リクエストを送信するURL。
14 * @return string|false リクエストが成功した場合はレスポンスボディ、失敗した場合はfalseを返します。
15 */
16function makeCurlRequestWithProxyBypass(string $url): string|false
17{
18    $ch = curl_init();
19
20    if ($ch === false) {
21        // cURLセッションの初期化に失敗した場合
22        error_log("cURLセッションの初期化に失敗しました。");
23        return false;
24    }
25
26    // デモ用のプロキシ設定。実際の環境に合わせて変更してください。
27    // 例: "http://your.proxy.server:8080"
28    // ここではローカルで動作するプロキシ(例: Fiddler, Charles Proxy)を想定しています。
29    $proxy = "http://127.0.0.1:8888";
30
31    // プロキシを介してリクエストを送信するよう設定します。
32    curl_setopt($ch, CURLOPT_PROXY, $proxy);
33
34    // プロキシをバイパスするホストを指定します。
35    // カンマ区切りで複数のホスト名を指定できます。
36    // ここでは 'localhost' および '127.0.0.1' へのアクセス時にプロキシを使いません。
37    curl_setopt($ch, CURLOPT_NOPROXY, 'localhost,127.0.0.1');
38
39    // リクエスト先のURLを設定します。
40    curl_setopt($ch, CURLOPT_URL, $url);
41
42    // 戻り値を文字列として取得する設定です(直接出力しない)。
43    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
44
45    // cURLリクエストを実行します。
46    $response = curl_exec($ch);
47
48    // エラーチェック
49    if (curl_errno($ch)) {
50        $error_msg = curl_error($ch);
51        error_log("cURLリクエストエラー(" . $url . "): " . $error_msg);
52        curl_close($ch);
53        return false;
54    }
55
56    // cURLセッションを閉じます。
57    curl_close($ch);
58
59    return $response;
60}

このサンプルコードは、PHPのcURLライブラリを用いてWebリクエストを送信する際に、プロキシサーバーを介しつつ、特定のホストへのアクセスではプロキシをバイパスする方法を示しています。

CURLOPT_PROXYオプションで、HTTPリクエストを転送するプロキシサーバーのアドレス(例: http://127.0.0.1:8888)を設定します。これに対し、CURLOPT_NOPROXYオプションは、プロキシ経由でアクセスしたくない特定のホスト名をカンマ区切りで指定するために使用されます。サンプルコードでは'localhost,127.0.0.1'が指定されており、これらのホストへのリクエスト時にはプロキシをバイパスし、直接アクセスが試みられます。

関数makeCurlRequestWithProxyBypassは、引数$urlでリクエストを送信する先のURLを受け取ります。関数内部では、curl_init()でcURLセッションを初期化し、先に述べたプロキシ関連のオプションに加え、CURLOPT_URLでリクエスト先を設定します。CURLOPT_RETURNTRANSFERtrueに設定することで、curl_exec()実行時にレスポンスが直接出力されず、戻り値として文字列で取得できるようになります。

リクエストが成功した場合、この関数はWebサーバーからのレスポンスボディを文字列として返します。しかし、何らかの理由でcURLリクエストが失敗した場合は、エラー情報がログに出力され、関数はfalseを返して処理を終了します。これにより、プロキシ環境下での柔軟な接続制御が可能となります。

このサンプルコードを利用する際は、プロキシ設定の有効性とCURLOPT_NOPROXYの正確な指定が特に重要です。サンプルコード中のプロキシ設定はデモ用のため、必ずご自身の環境に合わせて適切なプロキシサーバーのアドレスに変更してください。CURLOPT_NOPROXYでプロキシをバイパスするホスト名を指定する際には、カンマ区切りで正確に記述する必要があります。ワイルドカードは利用できませんのでご注意ください。ネットワーク環境やDNS設定によっては、期待通りの動作とならない場合があるため、実際に動作確認を丁寧に行うことを推奨します。また、curl_exec()後のエラーハンドリングは、通信の失敗時に問題を特定し適切に対処するために不可欠です。本番環境では、エラーログ出力だけでなく、ユーザーへのフィードバックや再試行処理なども考慮するとより安全です。プロキシ設定はセキュリティに直結するため、信頼できるプロキシを利用し、設定を慎重に管理することが求められます。

PHP cURL: プロキシ認証とNOPROXY設定

1<?php
2
3/**
4 * プロキシ認証とプロキシ除外設定 (NOPROXY) を使用してURLにアクセスする関数。
5 *
6 * @param string $url アクセスするターゲットURL。
7 * @param string $proxyHost プロキシサーバーのホスト名またはIPアドレス。
8 * @param int $proxyPort プロキシサーバーのポート番号。
9 * @param string $proxyUser プロキシ認証のユーザー名。
10 * @param string $proxyPass プロキシ認証のパスワード。
11 * @param string $noProxyHosts プロキシを使用しないホストのカンマ区切りリスト (例: "localhost,127.0.0.1")。
12 * @return string|false 成功した場合はレスポンス本文、失敗した場合はfalse。
13 */
14function fetchUrlWithProxyAndNoProxy(
15    string $url,
16    string $proxyHost,
17    int $proxyPort,
18    string $proxyUser,
19    string $proxyPass,
20    string $noProxyHosts
21): string|false {
22    // cURLセッションを初期化
23    $ch = curl_init();
24    if ($ch === false) {
25        error_log("cURLセッションの初期化に失敗しました。");
26        return false;
27    }
28
29    // ターゲットURLを設定
30    curl_setopt($ch, CURLOPT_URL, $url);
31    // レスポンスを文字列として返すように設定
32    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
33
34    // プロキシサーバーのホストとポートを設定
35    curl_setopt($ch, CURLOPT_PROXY, $proxyHost);
36    curl_setopt($ch, CURLOPT_PROXYPORT, $proxyPort);
37
38    // プロキシ認証のユーザー名とパスワードを設定
39    // CURLOPT_PROXYUSERPWD は "username:password" 形式の文字列を受け取ります。
40    curl_setopt($ch, CURLOPT_PROXYUSERPWD, "{$proxyUser}:{$proxyPass}");
41
42    // プロキシを使用しないホストを設定 (CURLOPT_NOPROXY)
43    // 指定されたホストへのリクエストはプロキシを介さずに直接行われます。
44    // 値はカンマ区切りのホスト名の文字列です (例: "localhost,192.168.1.1")。
45    curl_setopt($ch, CURLOPT_NOPROXY, $noProxyHosts);
46
47    // cURLリクエストを実行
48    $response = curl_exec($ch);
49
50    // エラーチェック
51    if (curl_errno($ch)) {
52        error_log("cURLエラー ({$url}): " . curl_error($ch));
53        $response = false;
54    }
55
56    // cURLセッションを閉じる
57    curl_close($ch);
58
59    return $response;
60}
61
62// --- 関数呼び出しの例 ---
63// ※以下の値はダミーです。ご自身の環境に合わせて置き換えてください。
64$targetUrl = "http://example.com";         // プロキシ経由でアクセスしたいURL
65$noProxyTargetUrl = "http://localhost";    // プロキシ経由せず直接アクセスしたいURL
66
67$proxyHost = "your_proxy_host.com";        // 例: "192.168.1.1"
68$proxyPort = 8080;                         // 例: 8080
69$proxyUser = "your_proxy_user";            // 例: "user123"
70$proxyPass = "your_proxy_password";        // 例: "password456"
71
72// プロキシを使用しないホストのリスト (カンマ区切り)
73$noProxyHosts = "localhost,127.0.0.1";
74
75echo "--- プロキシ経由でアクセスを試みるURL: {$targetUrl} ---\n";
76$resultViaProxy = fetchUrlWithProxyAndNoProxy(
77    $targetUrl,
78    $proxyHost,
79    $proxyPort,
80    $proxyUser,
81    $proxyPass,
82    $noProxyHosts
83);
84
85if ($resultViaProxy !== false) {
86    echo "成功 (レスポンスの一部):\n" . substr($resultViaProxy, 0, 100) . "...\n";
87} else {
88    echo "失敗。\n";
89}
90
91echo "\n--- NOPROXY対象として直接アクセスを試みるURL: {$noProxyTargetUrl} ---\n";
92// NOPROXYで指定されたホストは、設定されたプロキシを介さずに直接アクセスが試みられます。
93$resultNoProxy = fetchUrlWithProxyAndNoProxy(
94    $noProxyTargetUrl,
95    $proxyHost,
96    $proxyPort,
97    $proxyUser,
98    $proxyPass,
99    $noProxyHosts
100);
101
102if ($resultNoProxy !== false) {
103    echo "成功 (レスポンスの一部):\n" . substr($resultNoProxy, 0, 100) . "...\n";
104} else {
105    echo "失敗。\n";
106}

このPHPサンプルコードは、cURLライブラリを用いてWebページにアクセスする際に、プロキシサーバーの利用と、プロキシを使わない特定のホスト(NOPROXY)の設定方法を解説しています。fetchUrlWithProxyAndNoProxy関数は、アクセス対象のURL、プロキシのホストとポート、プロキシ認証のユーザー名とパスワード、そしてプロキシを介さずに直接アクセスしたいホストのリストを引数として受け取ります。

関数内部では、まずcurl_init()でcURLセッションを初期化し、CURLOPT_URLでターゲットURLを設定します。プロキシ経由でのアクセスには、CURLOPT_PROXYCURLOPT_PROXYPORTでプロキシサーバーの情報を指定します。プロキシ認証が必要な場合は、CURLOPT_PROXYUSERPWD オプションに「ユーザー名:パスワード」の形式で認証情報を設定します。

さらに、CURLOPT_NOPROXY オプションを使用することで、プロキシを通過させたくないホスト名をカンマ区切りで指定できます。これにより、指定されたホストへのリクエストはプロキシを介さず、直接行われるようになります。これは、特定の内部ネットワークリソースに直接アクセスしたい場合などに便利です。

curl_exec()でリクエストを実行し、成功すればWebページのコンテンツを文字列として返します。エラーが発生した場合はfalseが返され、error_logにエラーメッセージが記録されます。このサンプルは、プロキシ環境下での柔軟なネットワーク通信を実現するための基本的な設定を学ぶのに役立ちます。

プロキシ認証のユーザー名とパスワードは、セキュリティのためコードに直接記述せず、環境変数や設定ファイルから読み込むようにしてください。CURLOPT_PROXYUSERPWDオプションには「ユーザー名:パスワード」の正確な形式で文字列を設定する必要があります。また、CURLOPT_NOPROXYオプションで指定するホスト名は、カンマ区切りの文字列でなければ正しく機能しません。サンプルコードのダミー情報を、ご自身の環境に合わせた有効なプロキシサーバー情報とアクセス先URLに必ず置き換えてください。通信の失敗に備え、curl_errno関数で常にエラーチェックを行い、適切にエラー処理を実装することが重要です。CURLOPT_NOPROXYで除外したホストへは、プロキシを介さずに直接接続できるネットワーク環境が必要です。

関連コンテンツ

関連IT用語

関連プログラミング言語