2011-07-07 13 views
11

Mam dwie strony php. Chcę pobrać b.php w a.php.Czy można używać curl z względną ścieżką w PHP?

W moim a.php:

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

nie działa;

Ale:

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

jest OK. Jestem pewien, że a.php jest pod www.site.com.

Dlaczego curl nie może działać ze ścieżką względną? Czy jest w pobliżu praca?

+2

Nie ma absolutnie żadnego sensu względne ścieżki CURL. Czy możesz wyjaśnić, dlaczego uważasz, że to powinno działać? Jak by to działało? Jako obejście wystarczy skonstruować pełny adres URL pliku a.php i przekazać go. – BoltClock

+0

Myślę, że powinien działać jako XMLHTTPRequest w javascript, który akceptuje względne ścieżki. –

+1

XMLHTTPRequest w JavaScript wie o aktualnym bazowym url. cURL nie działa, dopóki nie podejmiesz minimalnego wysiłku, aby to powiedzieć. Do tego właśnie służy 'curl_init'. – mario

Odpowiedz

13

Curl jest biblioteką indywidualne, które tak naprawdę nie wiedzą nic o serwerach i gdzie to przychodzi z lub (philosophicaly) dlatego, że tam jest. Więc może „fałszywe” względnych adresów URL przy użyciu jednego z dwóch zmiennych _SERVER:

$_SERVER['SERVER_NAME'] 

Nazwa hosta serwera pod którym skrypt jest wykonywany. Jeśli skrypt działa na hoście wirtualnym, będzie to wartość zdefiniowana dla tego hosta wirtualnego.

$_SERVER['HTTP_HOST'] 

Zawartość host: nagłówek z aktualnego zapytania, jeśli taki istnieje.

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

Edit zmiana: Myślałem przez chwilę o tym: czy naprawdę trzeba pobrać go z dyni? Zazwyczaj mogą również pobierać żadnego innego wyjścia jak ten skrypt i zapisać napowietrznej ładowania go przez nowy wniosek http:

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

cUrl potrzebuje absolutnego URI do działania.

Względny URI nie działa, ponieważ nie podano podstawowego URI, do którego względny URI jest bezwzględny.

Możesz jednak, jeśli masz zarówno podstawowy identyfikator URI, jak i względny URI, utwórz bezwzględny URI względnego URI i użyj go z cUrl.

Zobacz 12.4.1 Resolving relative URIs.

Klasa PHP, która może zbudować bezwzględny URI na podstawie względnego URI i jego bazy to pakiet Net_URL2 w Pear.

3

cURL będzie używany przede wszystkim do pobierania danych z domen zewnętrznych, dlatego nie ma większego sensu dopuszczać względnych ścieżek. Najłatwiej jest po prostu dołączyć aktualną domenę do adresu URL.

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

Co powiesz na pobranie domeny z HTTP_HOST?

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

miałoby sens, aby również sprawdzić $ _SERVER ['HTTPS'] – wonk0

1

CURL ma absolutnie żadnej wiedzy o jego środowisku operacyjnym. Nie ma sposobu, aby dowiedzieć się, gdzie znajduje się "b.php". Czy powinien to zmienić w example.org/b.php lub some.wonky.multi.level.domain.co.uk/b.php?

Nawet traktowanie go jako lokalnego pliku odniesienia byłoby bezużyteczne ... CURL nie wiedziałby, że plik .php jest w rzeczywistości skryptem PHP. Nawet jeśli zrobiłoby to pobranie pliku lokalnego, to po prostu otrzymasz źródło PHP, a nie dane wyjściowe skryptu po uruchomieniu go przez PHP. Co jeśli masz stronę taką jak arstechnica.com, gdzie wszystkie jej strony są w rzeczywistości skryptami .ars? Czy to .asp? .aspx? .html? Skrypt PHP? perl? rubin?

Prosta odpowiedź: musisz zawsze podać pełny adres URL z protokołem, na którym będzie działał CURL.

Powiązane problemy