我已经使用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地址(它应该为null或访问代理服务器的HTTP_HOST变量)。
任何人都可以提出修复建议吗?
答案 0 :(得分:3)
value应该是option参数的以下值的数组:
... CURLOPT_HTTPHEADER An array of HTTP header fields to set, in the format array('Content-type: text/plain', 'Content-length: 100')
所以是的,我不认为你正确地设定它们。
答案 1 :(得分:2)
$ _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];
}
答案 2 :(得分:0)
您在$ _SERVER数组中给出了PHP使用的标题,但这是您在实际HTTP标头中使用的名称。例如,HTTP_HOST标头应作为“主机”发送。
我建议将$ fieldarray更改为从PHP名称映射到正确的HTTP标头名称,正如Ignacio在另一个答案中所说,检查curl文档以了解传递这些标题的方式。