【问题标题】:Is it possible to use curl with relative path in PHP?是否可以在 PHP 中使用 curl 和相对路径?
【发布时间】:2011-07-07 19:26:47
【问题描述】:

我有两个 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 不能使用相对路径?有解决办法吗?

【问题讨论】:

  • 首先卷曲相对路径绝对没有意义。你能解释一下为什么你认为它应该起作用吗?它将如何运作?作为一种解决方法,只需构建 a.php 的完整 URL 并将其传入。
  • 我认为它应该在接受相对路径的 javascript 中作为 XMLHTTPRequest 工作。
  • Javascript 中的 XMLHTTPRequest 知道当前的基本 url。 cURL 不会,除非您不费吹灰之力地告诉它。这就是curl_init 的用途。
  • 如果没有相对的点,怎么可能是相对的?

标签: php curl


【解决方案1】:

Curl 是一个独立的库,它并不真正了解网络服务器以及它来自何处或(哲学上)为什么存在它。因此,您可以使用两个 _SERVER 变量之一来“伪造”相对 url:

$_SERVER['SERVER_NAME'] 

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

$_SERVER['HTTP_HOST']

主机的内容:当前请求的标头,如果有的话。

见:http://php.net/manual/en/reserved.variables.server.php

编辑更新: 我想了一会儿:你真的需要用 curl 来获取它吗? 您通常还可以像这样获取另一个脚本的任何输出,并节省通过新的 http 请求加载它的开销:

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

【讨论】:

    【解决方案2】:

    从 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);
    

    【讨论】:

    • 检查 $_SERVER[ 'HTTPS' ]
    • 第 3 行和第 4 行缺少分号。
    【解决方案3】:

    cUrl 需要一个绝对 URI 才能操作。

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

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

    12.4.1 Resolving relative URIs

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        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脚本?珀尔?红宝石?

        所以.. 简单的回答:您必须始终指定一个完整的 URL 和协议,以便 CURL 操作。

        【讨论】:

          猜你喜欢
          • 2012-02-09
          • 1970-01-01
          • 2012-09-05
          • 2016-05-26
          • 2010-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多