Wie kann PHP die Proxy-Einstellung verwenden, um eine Verbindung zum Internet herzustellen?

Lesezeit: 5 Minuten

Benutzer-Avatar
Alexar

Ich bin hinter einem Proxy-Server, der keine direkte Verbindung zum Internet zulässt. Alle meine PHP-Anwendungen können sich nicht mit dem Internet verbinden, um nach Updates zu suchen usw.

Wie kann ich PHP meine Proxy-Einstellungen mitteilen?

Ich möchte keine Proxy-Einstellungen in den Code eingeben, ich möchte, dass PHP selbst sie über eine globale Konfigurationseinstellung oder ähnliches verwendet.

Benutzer-Avatar
Ian Hu

Wenn fast alle Internetzugänge einen Proxy benötigen, würde ich es vorziehen, so vorzugehen.

//add this as the first line of the entry file may it is the index.php or config.php
stream_context_set_default(['http'=>['proxy'=>'proxy-host:proxy-port']]);

der Proxy wird für arbeiten file_get_contents aber nicht curl_exec

Hier ist ein offizielles Dokument.

  • Entschuldigung für meinen Fehler, die Stream-API wirkt sich nicht auf die Locke aus. Wenn Sie Curl verwenden, sollten Sie sie besser einstellen curl_setopt($handle, CURLOPT_PROXY, $proxy_url);und wenn Sie beide verwenden, können Sie beide hinzufügen.

    – Ian Hu

    24. August 2016 um 1:49 Uhr

  • Ich konnte es nicht mit einem Proxy-Server mit Passwort zum Laufen bringen

    – Tarik

    31. August 2017 um 16:15 Uhr

  • @Tarik Wenn Ihr Proxy-Server eine grundlegende Authentifizierung benötigt, müssen Sie dies so tun stream_context_set_default(['http'=>['proxy'=>'proxy-host:proxy-port', 'header'=>'Proxy-Authorization: Basic '.base64_encode('your-username:your-password')]]);

    – Ian Hu

    13. März 2018 um 3:11 Uhr


  • @Tarik der entscheidende Punkt ist der Proxy-Authorization Header finden Sie weitere Informationen in der Antwort von @pascal-martin

    – Ian Hu

    13. März 2018 um 3:17 Uhr

  • @IanHu Danke, ich habe meine Lösung mit diesem Code gefunden: ‘$curlProxy = array( ‘http’=>array( ‘method’=>”GET”, ‘header’=>”Proxy-Authorization: Basic AUTH_CODE_HERE==\r \n” . “Proxy-Verbindung: Keep-Alive”, ‘proxy’=>”IP_ADDRESS:PORT” ) );’

    – Tarik

    13. März 2018 um 8:54 Uhr

Dies hängt davon ab, wie sich Ihre PHP-Anwendung mit dem Internet verbindet.

Wenn Sie die wahrscheinlichste Situation mit PHP cUrl verwenden. In diesem Fall helfen Ihnen die folgenden Optionen:

curl_setopt($handle, CURLOPT_PROXY, $proxy_url); 
curl_setopt($handle, CURLOPT_PROXYUSERPWD, "[username]:[password]"); 

Siehe auch: http://www.php.net/manual/en/function.curl-setopt.php

  • Danke für die Antwort. aber bedenken Sie, dass dies nur für meine eigenen Codes angewendet werden kann. Was ist mit anderen PHP-Anwendungen wie Drupal? Ich brauche PHP selbst über Proxy verbinden, nicht über den Code.

    – Alexar

    24. März 2011 um 10:00 Uhr

Beispielcode:

function getUrl($url)
{
    $ch = curl_init(); 
    $timeout = 5; // set to zero for no timeout 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    curl_setopt ($ch, CURLOPT_URL, $url); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_PROXY, "http://proxy.example.com"); //your proxy url
    curl_setopt($ch, CURLOPT_PROXYPORT, "8080"); // your proxy port number 
    curl_setopt($ch, CURLOPT_PROXYUSERPWD, "username:pass"); //username:pass 
    $file_contents = curl_exec($ch); 
    curl_close($ch); 
    return $file_contents;
}

echo  getUrl("http://www.google.com");

Ja es ist möglich!

Sie können konfigurieren stream_context_set_default in einer Datei, und fügen Sie diese Datei in Ihr gesamtes Php-Programm ein, indem Sie verwenden auto_prepend_file php.ini-Eigenschaft.

Ich habe eine kleine Zusammenfassung geschrieben über:

https://gist.github.com/ebuildy/381f116e9cd18216a69188ce0230708d

Und ein Artikel auf Französisch:

https://medium.com/@thomasdecaux/param%C3%A9trer-par-d%C3%A9faut-un-proxy-pour-php-file-get-content-3e9a32416979#.6zbg605cx

Diese Technik ist „cool“, weil sie es Ihrem Systemadministrator ermöglicht, den Host zu konfigurieren, sodass Entwickler nichts am Code ändern müssen.

Ich habe im Internet gesucht und nichts darüber gefunden stream_context_set_default() mit einer passwortgeschützt Proxy Server.

Dann dachte ich, dass das Passwort in der Basisautorisierung in Headern gesendet wird. Also habe ich die Header mit dem aus einer CURL-Anfrage extrahierten Passwort geändert und es hat perfekt funktioniert !!!

So machen Sie es:

Senden Sie diese Anfrage zunächst wie folgt an eine beliebige Domain (example.com):

curl -v -U user:pass -x your_proxy_ip:port --url https://example.com

Sehen Sie sich die von curl gesendeten Header an und ich habe diese Proxy-Zeilen zur späteren Verwendung:

>   Trying XXX.XXX.XXX.XXX...
> Connected to XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX) port YYYY (#0)
> Establish HTTP proxy tunnel to example.com:443
> Proxy auth using Basic with user 'your_username_here'
> CONNECT example.com:443 HTTP/1.1
> Host: example.com:443
> Proxy-Authorization: Basic YW1hem9uOnXXXXXXXXXXXXXXX25SMg
> User-Agent: curl/7.47.0
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection established
<
< Proxy replied OK to CONNECT request

OK, jetzt ist es an der Zeit, unseren benutzerdefinierten Header zu erstellen:

$default_opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Proxy-Authorization: Basic YW1hem9uOnXXXXXXXXXXXXXXX25SMg\r\n" .
              "Proxy-Connection: Keep-Alive",
    'proxy'=>"XXX.XXX.XXX.XXX:YYYY"
  )
);

$default = stream_context_set_default($default_opts);


$result = file_get_contents("https://ipleak.net/json/");
print_r(json_decode($result));

Und es funktioniert perfekt, Sie erhalten die IP Ihres Proxy-Servers als Antwort!

  • Wie kommst du darauf? YW1hem9uOnXXXXXXXXXXXXXXX25SMg

    – MindRoasterMir

    15. März 2021 um 13:14 Uhr

  • Die URL hat also den Benutzernamen und das Passwort in base64 codiert – developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…

    – MindRoasterMir

    15. März 2021 um 13:21 Uhr

  • Was machst du mit $default ?

    – MindRoasterMir

    15. März 2021 um 13:22 Uhr

Benutzer-Avatar
Martin Tournij

Ich benutze die BIRNE HTTP_Request2 Modul.

Hier ist eine vereinfachte Version meiner UrlOpen()-Funktion:

function UrlOpen($url)
{
  $request = new HTTP_Request2($url);

  $request->setConfig(array(
    'proxy_host' => '192.168.1.6',
    'proxy_port' => 8080,
    'proxy_user' => 'MYUSER',
    'proxy_password' => 'MYPASS',
    'ssl_verify_peer' => False,
    'connect_timeout' => 3,
  );

  return $request;
}

$req = UrlOpen($url);
$res = $req->send();
if ($res->getStatus() == '200')
  $data = $request->getBody();

  • Wie kommst du darauf? YW1hem9uOnXXXXXXXXXXXXXXX25SMg

    – MindRoasterMir

    15. März 2021 um 13:14 Uhr

  • Die URL hat also den Benutzernamen und das Passwort in base64 codiert – developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…

    – MindRoasterMir

    15. März 2021 um 13:21 Uhr

  • Was machst du mit $default ?

    – MindRoasterMir

    15. März 2021 um 13:22 Uhr

Benutzer-Avatar
Jokerius

Für Drupal können Sie die Proxy-Konfiguration in Ihrer settings.php-Datei festlegen.

$conf['proxy_server'] usw.

Mehr Details hier

1186040cookie-checkWie kann PHP die Proxy-Einstellung verwenden, um eine Verbindung zum Internet herzustellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy