Estoy tratando de hacer que curl siga una redirección, pero no consigo que funcione correctamente. Tengo una cadena que quiero enviar como parámetro GET a un servidor y obtener la URL resultante.
Ejemplo:
Cadena = URL de alimañas Kobold
= www.wowhead.com/search?q=Kobold+Worker
Si va a esa URL, lo redirigirá a "www.wowhead.com/npc=257". Quiero que curl devuelva esta URL a mi código PHP para poder extraer el "npc = 257" y usarlo.
Código actual:
function npcID($name) {
$urltopost = "http://www.wowhead.com/search?q=" . $name;
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
curl_setopt($ch, CURLOPT_URL, $urltopost);
curl_setopt($ch, CURLOPT_REFERER, "http://www.wowhead.com");
curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type:application/x-www-form-urlencoded"));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
return curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
}
Sin embargo, esto devuelve www.wowhead.com/search?q=Kobold+Worker y no www.wowhead.com/npc=257 .
Sospecho que PHP está regresando antes de que ocurra la redirección externa. ¿Cómo puedo arreglar esto?
curl
comando, pase el indicador-L
o--location
. Por ejemplocurl -L http://example.com/
Respuestas:
Para hacer que cURL siga una redirección, use:
Erm ... no creo que realmente estés ejecutando el rizo ... Prueba:
curl_exec($ch);
... después de configurar las opciones y antes de la
curl_getinfo()
llamada.EDITAR: si solo desea averiguar hacia dónde se redirige una página, usaría el consejo aquí , y solo usar Curl para tomar los encabezados y extraer el Ubicación: encabezado de ellos:
fuente
Agregue esta línea para curvar la inicialización
y use getinfo antes de curl_close
es:
fuente
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
es una vulnerabilidad de seguridad. Básicamente dice "Ignora los errores de SSL si está roto, confía en lo mismo que lo haría con una URL sin cifrar".La respuesta anterior no funcionó para mí en uno de mis servidores, algo relacionado con basedir, por lo que lo reescribí un poco. El siguiente código funciona en todos mis servidores.
fuente
Location:
encabezado no siempre es seguir una redirección. También vea una pregunta explícita sobre esto: error de ubicación de seguimiento de curlLa respuesta elegida aquí es decente, pero distingue entre mayúsculas y minúsculas, no protege contra
location:
encabezados relativos (lo que hacen algunos sitios) o páginas que en realidad podrían tener la fraseLocation:
en su contenido ... (que zillow tiene actualmente).Un poco descuidado, pero un par de ediciones rápidas para hacer esto un poco más inteligente son:
Tenga en cuenta que esto todavía solo va 1 redirección profunda. Para profundizar, realmente necesita obtener el contenido y seguir las redirecciones.
fuente
A veces necesita obtener encabezados HTTP, pero al mismo tiempo no desea devolver esos encabezados. **
Este esqueleto se encarga de las cookies y redireccionamientos HTTP mediante recursividad. La idea principal aquí es evitar devolver encabezados HTTP al código del cliente.
Puedes construir una clase de rizo muy fuerte sobre ella. Agregar funcionalidad POST, etc.
fuente
Muchas expresiones regulares aquí, a pesar de que realmente me gustan de esta manera, podrían ser más estables para mí:
La parte de ubicación es un enlace en el HTML enviado por apache. Entonces Xpath es perfecto para recuperarlo.
fuente
Puedes usar:
fuente