Php curl: проблема с настройкой HTTP_HOST - PullRequest
2 голосов
/ 27 ноября 2010

Я настроил внутренний прокси, используя php и curl.Большинство из них сделано, но у меня возникли проблемы с настройкой поля заголовка HTTP_HOST.Это код, который я использую:


Код на прокси-сервере ::

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

Однако на моем контент-сервере $ _SERVER ['HTTP_HOST']имеет собственный IP-адрес (это должен быть ноль или переменная HTTP_HOST, через которую осуществляется доступ к прокси-серверу).

Кто-нибудь может подсказать, что это за исправление?

Ответы [ 3 ]

3 голосов
/ 27 ноября 2010

С документация :

значение должно быть массивом для следующих значений параметра опции:

     ...

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

Так что даЯ не думаю, что вы устанавливаете их правильно.

2 голосов
/ 27 ноября 2010

Массив $ _SERVER не использует те же ключи, что и необработанные заголовки. Вы можете попробовать что-то вроде этого:

$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 голосов
/ 27 ноября 2010

Вы даете заголовкам имена, которые PHP использует в массиве $ _SERVER, но это имя, которое вы будете использовать в реальном HTTP-заголовке.Например, заголовок HTTP_HOST должен быть отправлен как «Host».

Я предлагаю изменить ваш $ fieldarray для отображения с имени PHP на правильное имя заголовка HTTP, и, как сказал Игнасио в другом ответе, проверьте скручивание.документация о том, как вы передаете эти заголовки.

...