У меня две страницы 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.
Почему завиток не может работать с относительным путем? Есть ли обходной путь?
Curl – это отдельная библиотека, которая на самом деле ничего не знает о веб-серверах и где она исходит или (философски), почему она существует. Таким образом, вы можете «подделывать» относительные URL-адреса, используя одну из двух переменных _SERVER:
$_SERVER['SERVER_NAME']
Имя хоста сервера, под которым выполняется текущий скрипт. Если скрипт запущен на виртуальном хосте, это будет значение, определенное для этого виртуального хоста.
$_SERVER['HTTP_HOST']
Содержимое заголовка Host: из текущего запроса, если таковой имеется.
См .: http://php.net/manual/en/reserved.variables.server.php
Изменить обновление: я подумал еще немного об этом: вам действительно нужно забрать его с помощью завитка? Обычно вы также можете получить любой вывод другого сценария, подобный этому, и сохранить накладные расходы на загрузку через новый HTTP-запрос:
ob_start(); require "b.php"; $output = ob_get_clean();
Как насчет приема домена из HTTP_HOST?
$domain = $_SERVER['HTTP_HOST']; $prefix = $_SERVER['HTTPS'] ? 'https://' : 'http://'; $relative = '/b.php' $ch = curl_init($prefix.$domain.$relative)
Для работы cUrl необходим абсолютный URI.
Относительный URI не работает, потому что не существует базового URI, для которого этот относительный URI является абсолютным.
Однако, если у вас есть базовый URI и относительный URI, создайте абсолютный URI относительного URI и используйте его с cUrl.
См. 12.4.1 Разрешение относительных URI .
Класс PHP, который может создавать абсолютный URI, основанный на относительном URI и его базе, представляет собой пакет Net_URL2 в Pear.
cURL в первую очередь будет использоваться для извлечения данных из внешних доменов, поэтому не будет иметь слишком большого смысла, чтобы допускать относительные пути. Самое простое – просто добавить свой текущий домен в URL.
$domain = $_SERVER['HTTP_HOST'] . "/"; $ch = curl_init($domain . "b.php"); echo(curl_exec($ch)); curl_close($ch);
CURL абсолютно не знает о своей операционной среде. Невозможно узнать, где находится «b.php». Должно ли это превратить это в example.org/b.php
или some.wonky.multi.level.domain.co.uk/b.php
?
Даже рассматривать его как локальную ссылку на файл было бы бесполезно … CURL не знал бы, что .php
файл на самом деле является скриптом PHP. Даже если он сделал локальную выборку файла, вы просто получите источник PHP, а не вывод скрипта после запуска PHP. Что делать, если у вас есть сайт, такой как arstechnica.com
где все его страницы на самом деле .ars
скриптами .ars
? Это .asp? .aspx? .html? PHP-скрипт? Perl? Рубин?
Итак .. простой ответ: вы должны всегда указывать полный URL-адрес, с протоколом, для работы CURL.