Можно ли использовать curl с относительным путем в PHP?

У меня есть две php-страницы. Я хочу получить b.php в a.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.

Почему завиток не может работать с относительным путем? Есть ли способ обхода?

Ответ 1

Curl - это отдельная библиотека, которая на самом деле ничего не знает о веб-серверах и где она исходит или (философски), почему она существует. Таким образом, вы можете "подделывать" относительные URL-адреса, используя одну из двух переменных _SERVER:

$_SERVER['SERVER_NAME'] 

Имя хоста сервера, под которым выполняется текущий script. Если script запущен на виртуальном хосте, это будет значение, определенное для этого виртуального хоста.

$_SERVER['HTTP_HOST']

Содержимое заголовка Host: из текущего запроса, если он есть.

Смотрите: http://php.net/manual/en/reserved.variables.server.php

Изменить обновление: Я подумал еще немного об этом: вам действительно нужно забрать его с помощью локон? Обычно вы также можете получить любой вывод другого script, как это, и сохранить накладные расходы на загрузку через новый 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);

Ответ 3

Для работы cUrl необходим абсолютный URI.

Относительный URI не работает, потому что не существует базового URI, для которого этот относительный URI является абсолютным.

Однако, если у вас есть базовый URI и относительный URI, создайте абсолютный URI относительного URI и используйте его с cUrl.

См. 12.4.1 Разрешение относительных URI.

Класс PHP, который может создавать абсолютный URI, основанный на относительном URI, и его базой является пакет Net_URL2 в Pear.

Ответ 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, а не вывод script после запуска PHP. Что делать, если у вас есть сайт типа arstechnica.com, где все его страницы на самом деле являются .ars скриптами? Это .asp?.aspx?.html? PHP скрипт? Perl? Рубин?

Итак, простой ответ: вы должны всегда указывать полный URL-адрес с протоколом для работы CURL.