file_get_contents hinter einem Proxy?

74

Bei der Arbeit müssen wir einen Proxy verwenden, um grundsätzlich auf Port 80 zuzugreifen. Beispielsweise haben wir für jeden Benutzer unsere eigenen benutzerdefinierten Anmeldungen.

Meine vorübergehende Problemumgehung besteht darin, Curl zu verwenden, um mich über einen Proxy als mich selbst anzumelden und auf die externen Daten zuzugreifen, die ich benötige.

Gibt es eine Art erweiterte PHP-Einstellung, die ich so einstellen kann, dass intern immer dann, wenn versucht wird, so etwas aufzurufen, wie file_get_contents()es immer über einen Proxy erfolgt? Ich bin am Windows-Geldautomaten, daher wäre es schwierig, ihn neu zu kompilieren, wenn dies der einzige Weg ist.

Der Grund, warum meine Problemumgehung nur vorübergehend ist, besteht darin, dass ich eine Lösung benötige, die generisch ist und für mehrere Benutzer funktioniert, anstatt die Anmeldeinformationen eines Benutzers zu verwenden (ich habe erwogen, ein separates Benutzerkonto nur zu diesem Zweck anzufordern, aber Kennwörter ändern sich häufig, und diese Technik muss in einem Zeitraum bereitgestellt werden Dutzend oder mehr Websites). Ich möchte Anmeldeinformationen nicht grundsätzlich fest codieren, um die Curl-Problemumgehung zu verwenden.

meder omuraliev
quelle

Antworten:

172

Um file_get_contents()über / über einen Proxy zu verwenden, für den keine Authentifizierung erforderlich ist, sollte Folgendes ausgeführt werden:

(Ich kann diesen nicht testen: Mein Proxy erfordert eine Authentifizierung.)

$aContext = array(
    'http' => array(
        'proxy'           => 'tcp://192.168.0.2:3128',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;

Natürlich ersetze ich die IP und den Port meines Proxys durch diejenigen, die für dich in Ordnung sind ;-)

Wenn Sie diese Art von Fehler erhalten:

Warning: file_get_contents(http://www.google.com) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 407 Proxy Authentication Required

Dies bedeutet, dass Ihr Proxy eine Authentifizierung erfordert.

Wenn für den Proxy eine Authentifizierung erforderlich ist, müssen Sie einige Zeilen wie folgt hinzufügen:

$auth = base64_encode('LOGIN:PASSWORD');

$aContext = array(
    'http' => array(
        'proxy'           => 'tcp://192.168.0.2:3128',
        'request_fulluri' => true,
        'header'          => "Proxy-Authorization: Basic $auth",
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;

Das Gleiche gilt für IP und Port und diesmal auch für LOGIN und PASSWORD ;-) Überprüfen Sie alle gültigen http-Optionen .

Jetzt übergeben Sie einen Proxy-Autorisierungs- Header an den Proxy, der Ihr Login und Passwort enthält.

Und ... Die Seite sollte angezeigt werden ;-)

Pascal MARTIN
quelle
Martin, ich habe eine Proxy-Auto-Konfigurationsdatei (pac) anstelle eines einzelnen Proxyservers. Außerdem ist eine NTLM-Authentifizierung erforderlich. Kannst du mir bitte hier raushelfen?
Codeomnitrix
Ich erhalte die folgende Fehlermeldung: Der Stream konnte nicht geöffnet werden: Der Socket-Transport "http" konnte nicht gefunden werden. Haben Sie vergessen, ihn zu aktivieren, als Sie PHP konfiguriert haben? Ich verwende PHP5.5 / Apache2.4 mit aktiviertem Curl.
Tuan Anh Hoang-Vu
Vielen Dank. Normalerweise befriedigt mich cURL, aber ich experimentiere mit Appengine PHP und habe keine cURL-Laode, so dass file_get_content mit Stream-Kontext mich gerettet hat: D
m3nda
@codeomnitrix, vielleicht etwas spät, aber ich hatte das gleiche Problem und habe die URL der pac-Datei in einen Browser eingefügt und in die Datei konnte ich die Proxy-IP-Adresse finden.
Martin Lietz
Für jeden: In meinem Fall war es auch notwendig, tcpals Protokoll zu verwenden. Bevor ich das verwendete, httpwas mir den Fehler gab: Fehler beim Öffnen des Streams: Der Socket-Transport "http" konnte nicht gefunden werden. Haben Sie vergessen, ihn zu aktivieren, als Sie PHP konfiguriert haben?
Robsch
23

Verwenden Sie stream_context_set_defaultFunktion. Die Verwendung ist viel einfacher, da Sie file_get_contents oder ähnliche Funktionen direkt verwenden können, ohne zusätzliche Parameter zu übergeben

Dieser Blog-Beitrag erklärt, wie man es benutzt. Hier ist der Code von dieser Seite.

<?php
// Edit the four values below
$PROXY_HOST = "proxy.example.com"; // Proxy server address
$PROXY_PORT = "1234";    // Proxy server port
$PROXY_USER = "LOGIN";    // Username
$PROXY_PASS = "PASSWORD";   // Password
// Username and Password are required only if your proxy server needs basic authentication

$auth = base64_encode("$PROXY_USER:$PROXY_PASS");
stream_context_set_default(
 array(
  'http' => array(
   'proxy' => "tcp://$PROXY_HOST:$PROXY_PORT",
   'request_fulluri' => true,
   'header' => "Proxy-Authorization: Basic $auth"
   // Remove the 'header' option if proxy authentication is not required
  )
 )
);

$url = "http://www.pirob.com/";

print_r( get_headers($url) );

echo file_get_contents($url);
?>
Pirob.com
quelle
2

Abhängig davon, wie die Proxy-Anmeldung funktioniert, kann Ihnen stream_context_set_default helfen.

$context  = stream_context_set_default(
  array(
    'http'=>array(
      'header'=>'Authorization: Basic ' . base64_encode('username'.':'.'userpass')
    )
  )
);
$result = file_get_contents('http://..../...');
VolkerK
quelle
1

Es gibt hier einen ähnlichen Beitrag: http://techpad.co.uk/content.php?sid=137, in dem erklärt wird, wie es geht.

function file_get_contents_proxy($url,$proxy){

    // Create context stream
    $context_array = array('http'=>array('proxy'=>$proxy,'request_fulluri'=>true));
    $context = stream_context_create($context_array);

    // Use context stream with file_get_contents
    $data = file_get_contents($url,false,$context);

    // Return data via proxy
    return $data;

}
Paul
quelle