wake-up-neo.com

Wie bringt man file_get_contents () dazu, mit HTTPS zu arbeiten?

Ich arbeite am Einrichten der Kreditkartenverarbeitung und musste eine Problemumgehung für CURL verwenden. Der folgende Code funktionierte einwandfrei, wenn ich den Testserver verwendete (der keine SSL-URL aufrief), aber jetzt, wenn ich ihn auf dem Arbeitsserver mit HTTPS teste, schlug die Fehlermeldung "Fehler beim Öffnen des Streams" fehl.

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);
}
99
James Simpson

Probieren Sie das folgende Skript aus, um festzustellen, ob für Ihre PHP-Skripte ein https-Wrapper verfügbar ist.

$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);

die ausgabe sollte so ähnlich sein

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

So erlauben Sie den https-Wrapper:

  • das php_openssl Erweiterung muss vorhanden und aktiviert sein
  • allow_url_fopen muss auf on gesetzt sein

In der php.ini-Datei sollten Sie diese Zeilen hinzufügen, wenn sie nicht existieren:

extension=php_openssl.dll

allow_url_fopen = On
112
hassan

Versuche Folgendes.

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;
}

Hinweis: Dadurch wird die SSL-Überprüfung deaktiviert, dh die von HTTPS angebotene Sicherheit geht verloren. Verwenden Sie diesen Code nur zum Testen/zur lokalen Entwicklung, niemals im Internet oder für andere öffentlich zugängliche Netzwerke. Wenn dieser Code funktioniert, bedeutet dies, dass das SSL-Zertifikat nicht vertrauenswürdig ist oder nicht überprüft werden kann. Dies sollten Sie als separates Problem untersuchen.

51
$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));

Auf diese Weise können Sie den Inhalt aus der URL abrufen, unabhängig davon, ob es sich um ein HTTPS handelt

37
Dushyant Dagar

Dies liegt wahrscheinlich daran, dass Ihr Zielserver kein gültiges SSL-Zertifikat hat.

9
Emil Vikström

Fügen Sie einfach zwei Zeilen in Ihre php.ini-Datei ein.

extension=php_openssl.dll

allow_url_include = On

es funktioniert für mich.

6
Ritesh Chandora

HTTPS wird ab PHP 4.3.0 unterstützt, sofern Sie OpenSSL unterstützt haben. Stellen Sie außerdem sicher, dass der Zielserver über ein gültiges Zertifikat verfügt, die Firewall ausgehende Verbindungen zulässt und allow_url_fopen in der php.ini ist auf true gesetzt.

5
Gordon

Ich hatte den gleichen fehler Einstellung allow_url_include = On im php.ini reparierte es für mich.

5
Jim Jones

In meinem Fall lag das Problem daran, dass WAMP für die CLI eine andere php.ini als Apache verwendet, sodass Ihre über das WAMP-Menü vorgenommenen Einstellungen nicht für die CLI gelten. Ändern Sie einfach die CLI php.ini und es funktioniert.

3
dtbarne

Manchmal entscheidet sich ein Server dafür, nicht zu antworten, basierend auf dem, was er in den HTTP-Anforderungsheadern sieht oder nicht sieht (z. B. einem geeigneten Benutzeragenten). Wenn Sie eine Verbindung mit einem Browser herstellen können, greifen Sie auf die gesendeten Header zu und ahmen Sie sie in Ihrem Stream-Kontext nach.

1
GZipp