75 votes

File_get_contents derrière un proxy?

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

Ma solution temporaire est d'utiliser curl pour me connecter en tant que moi-même via un proxy et accéder aux données externes dont j'ai besoin.

Y a-t-il une sorte de paramètre php avancé que je peux définir de sorte qu'internement chaque fois qu'il tente d'invoquer quelque chose comme file_get_contents() cela passe toujours par un proxy ? Je suis sur Windows ATM donc ce serait une douleur de recompiler si c'est la seule façon.

La raison pour laquelle ma solution temporaire est temporaire est parce que j'ai besoin d'une solution générique qui fonctionne pour plusieurs utilisateurs plutôt que d'utiliser les informations d'identification d'un seul utilisateur (j'ai envisagé de demander un compte utilisateur séparé uniquement pour faire cela mais les mots de passe changent souvent et cette technique doit être déployée sur une douzaine de sites ou plus). Je ne veux pas en gros coder en dur les informations d'identification pour utiliser la solution curl.

175voto

Pascal MARTIN Points 195780

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

(Je ne peux pas tester celui-ci : mon proxy requiert 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, remplacez l'IP et le port de mon proxy par ceux qui conviennent au vôtre ; -)

Si vous obtenez ce type 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 requiert 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 pour l'IP et le port, et, cette fois, aussi pour LOGIN et PASSWORD ;-) Consultez toutes les options HTTP valides.

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

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

0 votes

Martin, j'ai un fichier de configuration automatique de proxy (pac) au lieu d'un seul serveur proxy. Il nécessite également une authentification NTLM. Pouvez-vous m'aider s'il vous plaît?

0 votes

Je reçois l'erreur suivante : impossible d'ouvrir le flux : Impossible de trouver le transport de socket "http" - avez-vous oublié de l'activer lorsque vous avez configuré PHP? J'utilise PHP5.5/Apache2.4 avec curl activé.

0 votes

Merci beaucoup. Habituellement, cURL me satisfait, mais je suis en train d'expérimenter avec Appengine PHP, et je n'ai pas cURL chargé, donc file_get_content avec le contexte du flux m'a sauvé :D

23voto

Pirob.com Points 21

Utilisez la fonction stream_context_set_default. Il est beaucoup plus facile à utiliser car vous pouvez directement utiliser 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.

 array(
   'proxy' => "tcp://$PROXY_HOST:$PROXY_PORT",
   'request_fulluri' => true,
   'header' => "Proxy-Authorization: Basic $auth"
   // Supprimez l'option 'header' si l'authentification proxy n'est pas requise
  )
 )
);

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

print_r( get_headers($url) );

echo file_get_contents($url);
?>

2voto

VolkerK Points 54118

En fonction de la façon dont fonctionne la connexion proxy stream_context_set_default pourrait vous aider.

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

1voto

Paul Points 11

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){

    // Créer un flux de contexte
    $context_array = array('http'=>array('proxy'=>$proxy,'request_fulluri'=>true));
    $context = stream_context_create($context_array);

    // Utiliser le flux de contexte avec file_get_contents
    $data = file_get_contents($url,false,$context);

    // Renvoyer les données via le proxy
    return $data;

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X