是否可以在PHP中使用相对路径的curl?

时间:2011-07-07 19:26:48

标签: php curl

我有两个php页面。我想在a.php中获取b.php。

在我的a.php中:

$ch = curl_init("b.php");
echo(curl_exec($ch));
curl_close($ch);

不起作用;

可是:

$ch = curl_init("www.site.com/b.php");
echo(curl_exec($ch));
curl_close($ch);

没关系。我确定a.php在www.site.com下。

为什么curl无法使用相对路径?有解决方法吗?

5 个答案:

答案 0 :(得分:16)

如何从HTTP_HOST获取域名?

$domain = $_SERVER['HTTP_HOST'];
$prefix = $_SERVER['HTTPS'] ? 'https://' : 'http://';
$relative = '/b.php';
$ch = curl_init($prefix.$domain.$relative);
echo(curl_exec($ch));
curl_close($ch);

答案 1 :(得分:13)

Curl是一个独立的库,它对网络服务器及其来自何处或(哲学上)为什么都不知道。因此,您可以使用两个_SERVER变量中的一个来“伪造”相对URL:

$_SERVER['SERVER_NAME'] 
  

执行当前脚本的服务器主机的名称。如果脚本在虚拟主机上运行,​​则这将是为该虚拟主机定义的值。

$_SERVER['HTTP_HOST']
  

主机的内容:来自当前请求的标头(如果有)。

请参阅:http://php.net/manual/en/reserved.variables.server.php

修改更新 我想了一下这个问题:你真的需要用卷曲来取它吗? 您通常也可以获取此类其他脚本的任何输出,并节省通过新的http请求加载它的开销:

ob_start();
require "b.php";
$output = ob_get_clean();

答案 2 :(得分:4)

cUrl需要一个绝对的URI来操作。

相对URI不起作用,因为没有给出相对URI绝对的基本URI。

但是,如果您同时拥有基URI和相对URI,则可以创建相对URI的绝对URI,并将其与cUrl一起使用。

请参阅12.4.1 Resolving relative URIs

可以基于相对URI构建绝对URI的PHP类,它的基础是Pear中的Net_URL2包。

答案 3 :(得分:3)

cURL主要用于从外部域检索数据,因此允许相对路径没有多大意义。最简单的方法就是将当前域附加到URL。

$domain = $_SERVER['HTTP_HOST'] . "/";
$ch = curl_init($domain . "b.php");
echo(curl_exec($ch));
curl_close($ch);

答案 4 :(得分:1)

CURL绝对不了解其运营环境。没有办法知道'b.php'在哪里。是应该将其转换为example.org/b.php还是some.wonky.multi.level.domain.co.uk/b.php

即使将其视为本地文件引用也没用...... CURL不会知道.php文件实际上是PHP脚本。即使它进行了本地文件获取,你只需要PHP源代码,而不是PHP运行后的脚本输出。如果您有一个类似arstechnica.com的网站,其所有网页实际上都是.ars脚本,该怎么办?那是.asp吗? .ASPX? HTML吗? PHP脚本? Perl的?红宝石?

所以..简单回答:你必须始终指定一个完整的URL,带有协议,供CURL操作。