2010-11-27 18 views
2

J'ai configuré un proxy interne en utilisant php et curl. La plus grande partie est faite, cependant, j'ai du mal à régler le champ d'en-tête HTTP_HOST. Voici le code que je utilise:Php curl: problème de réglage HTTP_HOST


code sur le serveur proxy ::

$data_server_url = "http://IP_ADDRESS_OF_MY_CONTENT_SERVER/"; 
$request_uri=""; 
if(isset($_SERVER['REQUEST_URI'])) { $request_uri = $_SERVER['REQUEST_URI']; }; 
$curl_url="${data_server_url}${request_uri}"; 

//Pass all these fields as-they-are-got from the client to the content server. 
$field_array=array("HTTP_ACCEPT", "HTTP_ACCEPT_CHARSET", 
     "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", 
     "HTTP_HOST", "HTTP_REFERER", "HTTP_USER_AGENT"); 

$curl_request_headers=array(); 

foreach ($field_array as &$field) { 
    if(isset($_SERVER["$field"])) { 
     $curl_request_headers["$field"]=$_SERVER["$field"]; 
    } else { 
     $curl_request_headers["$field"]=""; 
    }; 
}; 

//Open connection 
$curl_handle = curl_init(); 
//Set the url, number of POST vars, POST data 
curl_setopt($curl_handle, CURLOPT_URL, $curl_url); 
curl_setopt($curl_handle, CURLOPT_POST, count($_POST)); 
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $_POST); 
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE); 
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $curl_request_headers); 
//Execute post 
$result = curl_exec($curl_handle); 
//Close connection 
curl_close($curl_handle); 

Cependant, sur mon serveur de contenu, $ _SERVER [ 'HTTP_HOST'] est réglé sur la sa propre adresse IP (elle devrait être nulle ou la variable HTTP_HOST à ​​laquelle on accède au serveur proxy).

Quelqu'un peut-il suggérer quelle est la solution?

Répondre

3

De the documentation:

valeur

doit être un tableau pour les valeurs suivantes du paramètre option:

 ... 

CURLOPT_HTTPHEADER An array of HTTP header fields to set, in the format 
         array('Content-type: text/plain', 'Content-length: 100') 

Alors oui, je ne pense pas que vous les mettre correctement .

+0

Merci. Cela a fonctionné! –

0

Vous donnez aux en-têtes les noms PHP utilisés dans le tableau $ _SERVER, mais c'est le nom que vous utiliseriez dans un en-tête HTTP réel. Par exemple, l'en-tête HTTP_HOST doit être envoyé en tant que 'Host'. Je suggère de changer votre $ fieldarray pour mapper du nom PHP au nom d'en-tête HTTP correct, et comme Ignacio dit dans une autre réponse, vérifiez la documentation de curl pour la façon dont vous passez ces en-têtes.

2

La baie $ _SERVER n'utilise pas les mêmes clés que les en-têtes raw. Vous pourriez essayer quelque chose comme ceci:

$pass_headers = array(
    'Host' => 'HTTP_HOST', 
    'Accept' => 'HTTP_ACCEPT', 
    'Accept-Charset' => 'HTTP_ACCEPT_CHARSET', 
    'Accept-Encoding' => 'HTTP_ACCEPT_ENCODING', 
    'Accept-Language' => 'HTTP_ACCEPT_LANGUAGE', 
    'Connection' => 'HTTP_CONNECTION', 
    'Referer' => 'HTTP_REFERER', 
    'User-Agent' => 'HTTP_USER_AGENT', 
); 

$curl_request_headers = array(); 
foreach($pass_headers as $header_key => $server_key) { 
    $curl_request_headers[] = $header_key.': '.$_SERVER[$server_key]; 
} 
+0

Merci! J'ai essayé cela. Aurait été plus propre mais malheureusement ne fonctionne pas. Il doit être dans le format exact (avec les deux-points) comme Ignacio l'a mentionné. –

+0

Le code mis à jour devrait fonctionner. – Kevin

+0

Ya, en utilisant quelque chose de très similaire maintenant! –