2011-07-07 23 views
11

Tengo dos páginas php. Quiero buscar b.php en a.php.¿Es posible usar curl con ruta relativa en PHP?

En mi a.php:

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

No funciona;

Pero:

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

está bien. Estoy seguro de que a.php está en www.site.com.

¿Por qué curl no funciona con la ruta relativa? ¿Hay alguna solución?

+2

En primer lugar, no tiene sentido CURRICAR las rutas relativas. ¿Podría explicar por qué cree que debería funcionar? ¿Cómo funcionaría? Como solución, simplemente construya la URL completa a 'a.php' y póngala. – BoltClock

+0

Creo que debería funcionar como XMLHTTPRequest en javascript que acepta rutas relativas. –

+1

XMLHTTPRequest en Javascript sabe sobre la url base actual. cURL no lo hace a menos que se tome el mínimo esfuerzo para contarlo. Y para eso sirve 'curl_init'. – mario

Respuesta

13

Curl es una biblioteca independiente que en realidad no sabe nada acerca de los servidores web y de dónde viene desde o (philosophicaly) por qué está allí. Por lo que puede 'falsos' URL relativos utilizando una de las dos variables: _SERVER

$_SERVER['SERVER_NAME'] 

El nombre del host del servidor en virtud del cual el script actual se está ejecutando. Si el script se ejecuta en un host virtual, este será el valor definido para ese host virtual.

$_SERVER['HTTP_HOST'] 

El contenido de la cabecera Host: de la petición actual, si es que existe.

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

Editar actualización: pensé un momento más acerca de esto: lo que realmente necesita a buscarlo con rizo? Por lo general, también se puede ir a buscar cualquier salida de otro script como este y guardar la sobrecarga de cargarlo a través de una nueva petición http:

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

cUrl necesita un URI absoluto para operar.

Un URI relativo no funciona porque no hay un URI base dado que ese URI relativo es absoluto.

Sin embargo, si tiene tanto el URI base como el URI relativo, cree el URI absoluto del URI relativo y úselo con cUrl.

Ver 12.4.1 Resolving relative URIs.

Una clase PHP que puede construir un URI absoluto basado en un URI relativo y su base es el paquete Net_URL2 en Pear.

3

cURL se usaría principalmente para recuperar datos de dominios externos, por lo tanto, no tendría demasiado sentido permitir rutas relativas. Lo más fácil sería agregar su dominio actual a la URL.

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

¿Qué le parece tomar el dominio de HTTP_HOST?

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

tendría sentido también marcar $ _SERVER ['HTTPS'] – wonk0

1

CURL no tiene absolutamente ningún conocimiento de su entorno operativo. No hay forma de que sepa dónde está 'b.php'. ¿Debería convertir eso en example.org/b.php o some.wonky.multi.level.domain.co.uk/b.php?

Incluso tratarlo como una referencia de archivo local sería inútil ... CURL no sabría que un archivo .php es realmente un script PHP. Incluso si hiciera una búsqueda local de archivos, obtendría el código PHP, no el resultado de la secuencia de comandos después de ejecutar PHP. ¿Qué sucede si tiene un sitio como arstechnica.com donde todas sus páginas son realmente scripts .ars? ¿Es eso .asp? .aspx? .html? Script PHP? Perl? ¿rubí?

Así que ... respuesta simple: siempre debe especificar una URL completa, con protocolo, para que CURL funcione.