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