2010-07-19 32 views
5

He intentado conectarme a mi propio sitio utilizando tanto el CURL como la función PHP file_get_contents() para obtener el origen de mi página web sin éxito. Estoy ejecutando el script PHP en el mismo servidor desde el que trato de obtener el código fuente HTML. CURL no devuelve ningún error, ni siquiera cuando se utiliza curl_error(), y la función de los file_get_contents PHP() devuelve lo siguiente:file_get_contents() conexión rechazada para mi propio sitio

Advertencia: file_get_contents ([nombre del sitio]) [function.file-get-contenidos] : no se pudo abrir la secuencia: conexión rechazada en [ruta del archivo] en la línea 19.

No tengo idea de por qué es esto. ¿Por qué un servidor rechazaría activamente esta conexión? ¿Cómo puedo detenerlo?

Gracias

EDIT:

Como referencia aquí es mi (Curl) Código:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://www.mydomain.co.uk'); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_REFERER, ''); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2'); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: www.mydomain.co.uk')); 

$rawHTML = curl_exec($ch); 
$err = curl_error($ch); 
curl_close($ch); 

print $err; 
print 'HTML: ' . $rawHTML; 
+0

¿Qué protocolo se utiliza? –

+0

Estoy usando el protocolo HTTP. – CJD

Respuesta

9

Tenga una mirada en la configuracion de firewall, pueden ser un poco demasiado estricto. ¿Qué sucede si inicia sesión y

telnet localhost 80 

o el equivalente para su sistema operativo de su elección? Y pruebe lo mismo con localhost pero con la IP completa de su servidor. Solo si tiene éxito, tienes un problema curl/php.

editar: bien, así que la conexión a localhost funciona, usando file_get_contents("http://localhost/");.

Esto significa que puede acceder a su sitio a través de localhost, pero debe anular el campo Host: enviado con la solicitud. Esto no es exactamente el uso normal de cURL, pero puede probar:

curl_setopt(CURLOPT_HTTPHEADER,array('Host: yourdomain.com')); 

al tiempo que solicita el URL http://127.0.0.1/. Me pregunto si esto se entenderá por curl, pero puedes intentarlo.

editar^2: Si esto no funciona para engañar a cURL, basta con abrir su propia conexión de socket y hacer su propia solicitud:

$ip = '127.0.0.1'; 
$fp = fsockopen($ip, 80, $errno, $errstr, 5); 
$result = ''; 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    $out = "GET/HTTP/1.1\r\n"; 
    $out .= "Host: www.exampl.com\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
     $result .= fgets($fp, 128); 
    } 
    fclose($fp); 
} 

(esto es una adaptación de un ejemplo php.net)

+0

+1 - Normalmente 'localhost' funcionaría, pero a menudo usar el nombre real del servidor o IP pública no. Muchos cortafuegos/enrutadores no permitirán las solicitudes que esencialmente "vuelven" a través del enrutador. –

+0

Me temo que no tengo acceso telnet al servidor web. ¿Hay alguna forma de que pueda emular/probar esto usando comandos PHP? – CJD

+0

err .. eso es básicamente lo que estás haciendo ;-) Intenta conectarte a localhost (o '127.0.0.1', o' 0.0.0.0', de todos modos) y ver qué pasa. Si se encuentra en un entorno de alojamiento compartido, recibirá una respuesta de error, pero al menos sabrá que tiene conectividad. Entonces, por ejemplo, 'file_get_contents (" http://127.0.0.1/ ");' – mvds

0

He tenido este problema antes cuando uso un servidor compartido con una empresa de hosting, ya que muchas funciones están desactivadas. ¿Estás en un servidor compartido/recibes tu hosting gratis?

Compruebe si cURL está habilitado en su servidor también en su configuración de PHP.

<?php 

// Show all information 
phpinfo(); 

?> 

Si los datos que está intentando acceder está en el mismo servidor, puede utilizar fopen:

$myFile = "testFile.txt"; 
$fh = fopen($myFile, 'r'); 
$theData = fread($fh, 5); 
fclose($fh); 
echo $theData; 

http://php.net/manual/en/function.fopen.php

+0

CURL está habilitado ya que funciona con otros sitios. Y, de hecho, estoy usando alojamiento compartido, que creo que es por eso que no está funcionando. – CJD

+0

Sí, parece recordar haber tenido exactamente el mismo problema en mi host compartido. No sé si ya lo ha considerado, ¿pero podría usar fopen en su lugar? He editado mi publicación anterior. –

+0

Miedo no, ya que estoy después de la salida, no el contenido. – CJD

0

Posiblemente una pregunta estúpida, pero usted no tiene una contraseña .htaccess establecida ¿verdad? Si el navegador lo almacena, es posible que lo olvide, pero el servidor PHP no lo tiene, pero aún lo necesitará para acceder al sitio. Casi seguro que no, pero tal vez valga la pena sugerirlo.

+0

Gracias por la sugerencia, pero no, no tengo protección con contraseña en la URL raíz. – CJD

5

Posiblemente porque su sitio apunta a una IP pública, que a su vez está asignada a una IP interna como mvds señaló.

www.domain.com = 234.234.234.234

servidor IP: 10.0.0.1

mapas firewall 234.234.234.234 -> 10.0.0.1 de redes externas, pero no de tráfico interno.

Por lo tanto, debe conectarse a su máquina con la dirección IP local o localhost (127.0.0.1) pero manteniendo el encabezado de host (www.domain.com).

Las opciones son:

  1. Haga su proveedor de configuración de enrutamiento correcto para sus IPs externas en su cortafuegos. Es posible, pero a menudo se pierde, ya que rara vez se necesita. Un argumento para que esto funcione es porque no puede acceder a otros sitios que residen en el mismo segmento de red que usted hoy.

  2. a su proveedor de añadir www.domain.com ->127.0.0.1 en el anfitriones en archivos en el servidor de

  3. utilizar su propio código para toma de "falso" el encabezado de host sin dejar de conectarse a localhost . Hay muchas clases de ejemplo para esto en PHP y mvds ya le dio un ejemplo.

  4. Encuentra otra forma de recuperar la información. Está en el mismo servidor, ¿no? Ir a buscar por http parece redundante ...

+0

Gracias por la explicación detallada y consejos. – CJD

+0

ad 4) un truco realmente feo (pero efectivo) es establecer '$ _GET [...] = ...' con los parámetros que necesite y luego 'incluir' un archivo. – mvds

3

Todo el problema fue la de añadir esta línea al archivo de hosts (/ etc/hosts)

127.0.0.1 example.com www.example.com 

Gracias a jishi! :)

0

La forma más fácil de recuperar un archivo local es utilizar la ruta local.

file_get_contents('/home/usr/public_html/path/page.html'); 

La ruta del nombre del archivo cambiará de un servidor a otro, pero debe tener la idea.

En mi camino, "/ usr /" es el nombre de usuario de la cuenta.

O si script está en el mismo directorio de la página, puede utilizar:

file_get_contents('page.html'); 
Cuestiones relacionadas