cURL 与虚拟主机命名有关的本地开发网络问题

Posted

技术标签:

【中文标题】cURL 与虚拟主机命名有关的本地开发网络问题【英文标题】:cURL on local dev network problem with virtual host naming 【发布时间】:2011-07-23 04:06:51 【问题描述】:

尝试在虚拟服务器上进行一些本地测试,问题是 cURL 返回 http_code => 0

我认为这与我的虚拟主机命名有关。

虚拟主机名:dev.project

cURL 请求正在添加 http://

如果我从命令行 ping:dev.project,我会成功。 如果我用http://dev.project 尝试它,我会得到未知主机。

是否有一个 curl_setopt 选项仅用于使用主机名?我不确定我是否可以使用该 IP,因为服务器上有多个项目,或者 Apache 会处理这个?

这是我尝试过的:

$request_url  = 'dev.project';
$request_args = 'parm=1234';
$user_agent   = 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (Khtml, like Gecko) Chrome/10.0.648.151 Safari/534.16';

$ch = curl_init();

// set curl options (GET)       
curl_setopt($ch, CURLOPT_URL, $request_url.'?'.$request_args);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);
//curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
//curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
//curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // CHANGE THIS TO TRUE

// Set curl options (POST)
//curl_setopt($ch, CURLOPT_URL, $request_url);
//curl_setopt($ch, CURLOPT_POST, TRUE);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $request_args);
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
//curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
//curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

$response = curl_exec($ch); 
echo "<pre>".print_r($response,true)."</pre><br />\n"; // nothing is returned
print_r(curl_getinfo($ch));

curl_close($ch); 

来自 curl_getinfo() 的响应:(注意:http:// 在 url 中预先添加)

Array
(
    [url] => http://dev.project?parm=1234
    [http_code] => 0
    [header_size] => 0
    [request_size] => 0
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0
    [namelookup_time] => 0
    [connect_time] => 0
    [pretransfer_time] => 0
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 0
    [redirect_time] => 0
)

【问题讨论】:

嗯,这是怎么回事?为什么要接近投票? cURL 仅适用于 URL。协议前缀不是问题,除非您想要原始 TCP 套接字连接。也许它无法解析主机名。它是否列在/etc/hosts 中?其他尝试.localnet 后缀(可能需要本地 DNS 或其他东西;我只是在挥手)。 【参考方案1】:

如果有人遇到这个问题,这里是修复:

// This is your Virtual Hosts name
$request_host   = 'dev.project'; 

// This is the IP
$request_url    = '192.168.0.1';

$headers = array("Host: ".$request_host);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);     
curl_setopt($ch, CURLOPT_URL, $request_url.'?'.$request_args);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

【讨论】:

这拯救了我的理智。

以上是关于cURL 与虚拟主机命名有关的本地开发网络问题的主要内容,如果未能解决你的问题,请参考以下文章

php curl在本地主机中不起作用

PHP CURL 对于本地主机来说太慢了

PHP CURL 对于本地主机来说太慢了

本地 WordPress 站点上的 cURL 返回:错误 6(无法解析主机)

php恢复ftp上传与curl multi

“本地主机没有发送数据。ERR_EMPTY_RESPONSE”和“curl:(52)来自服务器的空回复”