Php curl:问题设置HTTP_HOST

Php curl:问题设置HTTP_HOST

问题描述:

I have setup an internal proxy using php and curl. Most of it is done, however, I am having trouble setting HTTP_HOST header field. This is the code I am using:


Code on the proxy server::

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

However, on my content server, $_SERVER['HTTP_HOST'] is set to the its own IP address (it should be null or the HTTP_HOST variable through which the the proxy server is accessed).

Can anyone suggest what is the fix?

我已经使用php和curl设置了一个内部代理。 大部分都已完成,但是,我在设置HTTP_HOST头字段时遇到问题。 这是我正在使用的代码: p>


代理服务器上的代码:: p>

  $ 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}”; 
 
 //将所有这些字段从客户端传递到内容服务器。
 $ 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(); 
  
 
Nachach($ field_array as& $ field){
 if(isset($ _ SERVER [“$ field”])){
 $ curl_request_headers [“$ field”] = $ _ SERVER [“$ field”]; \  n} else {
 $ curl_request_headers [“$ field”] =“”; 
}; 
}; 
 
 //打开连接
 $ curl_handle = curl_init(); 
 //设置网址 ,POST数量,POST数据
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)  ; 
 //执行post 
 $ result = curl_exec($ curl_handle); 
 //关闭连接
curl_close($ curl_handle); 
  code>  pre> 
 
 

但是,在我的内容服务器上,$ _SERVER ['HTTP_HOST']设置为自己的IP地址(它应该为null或访问代理服务器的HTTP_HOST变量)。 p>

任何人都可以提出修复建议吗? p> div>

From the documentation:

value should be an array for the following values of the option parameter:

     ...

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

So yeah, I don't think you're setting them properly.

You are giving the headers the names PHP uses in the $_SERVER array, but this is the name you would use in an actual HTTP header. For example, the HTTP_HOST header should be sent as 'Host'.

I suggest changing your $fieldarray to map from the PHP name to the correct HTTP header name, and as Ignacio says in another answer, check the curl documentation for the way you are passing those headers.

The $_SERVER array does not use the same keys as the raw headers. You might try something like this:

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