web-dev-qa-db-ja.com

file_get_contents()をHTTPSで動作させる方法は?

私はクレジットカード処理の設定に取り組んでおり、CURLの回避策を使用する必要がありました。次のコードは、テストサーバー(SSL URLを呼び出していません)を使用している場合は正常に機能していましたが、HTTPSを使用して作業サーバーでテストすると、「ストリームを開くことができませんでした」というエラーメッセージで失敗します。

function send($packet, $url) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>$packet
      )
    )
  );
  return file_get_contents($url, 0, $ctx);
}
97
James Simpson

次のスクリプトを試して、PHPスクリプトで使用できるhttpsラッパーがあるかどうかを確認してください。

$w = stream_get_wrappers();
echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_export($w);

出力は次のようになります

openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
  [...]
}
86
VolkerK

Httpsラッパーを許可するには:

  • php_openssl拡張が存在し、有効になっている必要があります
  • allow_url_fopenonに設定する必要があります

Php.iniファイルに、次の行が存在しない場合は追加する必要があります。

extension=php_openssl.dll

allow_url_fopen = On
112
hassan

以下を試してください。

function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

注:これにより、SSL検証が無効になります。つまり、HTTPSが提供するセキュリティが失われますです。このコードは、テスト/ローカル開発、インターネット上ではない、またはその他の公共向けネットワークにのみ使用してください。このコードが機能する場合は、SSL証明書が信頼されていないか、検証できないことを意味します。別の問題として修正を検討する必要があります。

50
$url= 'https://example.com';

$arrContextOptions=array(
      "ssl"=>array(
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ),
    );  

$response = file_get_contents($url, false, stream_context_create($arrContextOptions));

これにより、HTTPSであるかどうかにかかわらず、URLからコンテンツを取得できます

36
Dushyant Dagar

これは、おそらくターゲットサーバーに有効なSSL証明書がないためです。

9
Emil Vikström

Php.iniファイルに2行追加するだけです。

extension=php_openssl.dll

allow_url_include = On

私のために働いています。

6
Ritesh Chandora

HTTPSは、OpenSSLのサポートでコンパイルした場合、PHP 4.3.0以降でサポートされます。また、ターゲットサーバーに有効な証明書があり、ファイアウォールがアウトバウンド接続を許可し、php.iniのallow_url_fopenがtrueに設定されていることを確認してください。

5
Gordon

同じエラーが発生しました。 allow_url_include = Onphp.iniを設定すると、修正されました。

5
Jim Jones

私の場合、この問題は、Apacheとは異なるCLI用のphp.iniを使用するWAMPが原因であったため、WAMPメニューで行った設定はCLIに適用されません。 CLI php.iniを変更するだけで機能します。

3
dtbarne

サーバーは、httpリクエストヘッダーに表示される内容または表示されない内容(適切なユーザーエージェントなど)に基づいて応答しないことを選択する場合があります。ブラウザーに接続できる場合は、ブラウザーが送信するヘッダーを取得し、ストリームコンテキストでそれらを模倣します。

1
GZipp