我有两个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无法使用相对路径?有解决方法吗?
答案 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操作。