Php curl:设置 HTTP_HOST 时出现问题
我已经使用 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 变量,通过该变量,访问代理服务器)。
谁能建议解决办法是什么?
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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
来自文档:
所以是的,我认为您没有正确设置它们。
From the documentation:
So yeah, I don't think you're setting them properly.
$_SERVER 数组不使用与原始标头相同的键。你可以尝试这样的事情:
The $_SERVER array does not use the same keys as the raw headers. You might try something like this:
您为标头指定了 PHP 在 $_SERVER 数组中使用的名称,但这是您在实际 HTTP 标头中使用的名称。例如,HTTP_HOST 标头应作为“Host”发送。
我建议更改您的 $fieldarray 以从 PHP 名称映射到正确的 HTTP 标头名称,正如 Ignacio 在另一个答案中所说,请检查curl 文档以了解传递这些标头的方式。
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.