web-dev-qa-db-fra.com

file_get_contents derrière un proxy?

Au travail, nous devons utiliser un proxy pour accéder au port 80, par exemple, nous avons nos propres connexions personnalisées pour chaque utilisateur.

Ma solution de contournement temporaire utilise curl pour me connecter en tant que moi via un proxy et accéder aux données externes dont j'ai besoin.

Existe-t-il une sorte de paramètre php avancé que je peux définir de sorte qu'en interne chaque fois qu'il essaie d'invoquer quelque chose comme file_get_contents(), il passe toujours par un proxy? Je suis sur Windows ATM, donc ce serait difficile de recompiler si c'est le seul moyen.

La raison pour laquelle cette solution de contournement est temporaire est parce que j'ai besoin d'une solution générique qui fonctionne pour plusieurs utilisateurs au lieu d'utiliser les informations d'identification d'un seul utilisateur (j'ai envisagé de demander un compte d'utilisateur distinct uniquement pour cela, mais les mots de passe changent souvent et cette technique doit être déployée tout au long d'un une dizaine de sites ou plus). Je ne veux pas coder en dur les informations d'identification pour utiliser la solution de contournement curl.

69
meder omuraliev

Pour utiliser file_get_contents() sur/via un proxy qui ne nécessite pas d'authentification, quelque chose comme ceci devrait faire:

(Je ne peux pas tester celui-ci: mon proxy nécessite une authentification)

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

Bien sûr, remplacer l'IP et le port de mon proxy par ceux qui vous conviennent ;-)

Si vous obtenez ce genre d'erreur:

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

Cela signifie que votre proxy nécessite une authentification.

Si le proxy nécessite une authentification, vous devrez ajouter quelques lignes, comme ceci:

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

Même chose à propos de l'IP et du port, et, cette fois, également de la CONNEXION et du MOT DE PASSE ;-) Découvrez toutes les options http valides .

Maintenant, vous passez un en-tête Proxy-Authorization au proxy, contenant votre identifiant et votre mot de passe.

Et ... La page devrait s'afficher ;-)

162
Pascal MARTIN

Utilisation stream_context_set_default une fonction. Il est beaucoup plus facile à utiliser car vous pouvez utiliser directement file_get_contents ou des fonctions similaires sans passer de paramètres supplémentaires

Ce article de blog explique comment l'utiliser. Voici le code de cette page.

<?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);
?>
21
Pirob.com

Il y a un article similaire ici: http://techpad.co.uk/content.php?sid=137 qui explique comment le faire.

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;

}
1
Paul

Selon le fonctionnement de la connexion proxy stream_context_set_default peut vous aider.

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