J'essaie de faire en sorte que curl suive une redirection mais je n'arrive pas à le faire fonctionner correctement. J'ai une chaîne que je veux envoyer en tant que paramètre GET à un serveur et obtenir l'URL résultante.
Exemple:
Chaîne = URL de la vermine de Kobold
= www.wowhead.com/search?q=Kobold+Worker
Si vous accédez à cette URL, il vous redirigera vers "www.wowhead.com/npc=257". Je veux que curl renvoie cette URL à mon code PHP afin que je puisse extraire le "npc = 257" et l'utiliser.
Code actuel:
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);
}
Cela renvoie cependant www.wowhead.com/search?q=Kobold+Worker et non www.wowhead.com/npc=257 .
Je soupçonne que PHP est de retour avant que la redirection externe ne se produise. Comment puis-je réparer cela?
curl
commande, passez l' indicateur-L
ou--location
. Par exemplecurl -L http://example.com/
Réponses:
Pour que cURL suive une redirection, utilisez:
Euh ... Je ne pense pas que vous exécutez réellement la boucle ... Essayez:
curl_exec($ch);
... après avoir défini les options et avant l'
curl_getinfo()
appel.EDIT: Si vous voulez juste savoir vers où une page redirige, j'utiliserais les conseils ici , et utiliserais simplement Curl pour récupérer les en-têtes et en extraire l'en-tête Location::
la source
Ajouter cette ligne pour curl initialisation
et utilisez getinfo avant curl_close
es:
la source
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
est une faille de sécurité. Il dit essentiellement «Ignorez les erreurs SSL si elles sont brisées - faites confiance comme vous le feriez pour une URL non chiffrée».La réponse ci-dessus n'a pas fonctionné pour moi sur l'un de mes serveurs, quelque chose à avec basedir, donc je l'ai un peu hachée. Le code ci-dessous fonctionne sur tous mes serveurs.
la source
Location:
tête n'est pas toujours de suivre une redirection. Veuillez également consulter une question qui concerne explicitement ceci: erreur de localisation de suivi de curlLa réponse choisie ici est décente mais sa sensibilité à la casse ne protège pas contre les en-
location:
têtes relatifs (ce que font certains sites) ou les pages qui pourraient en fait avoir la phraseLocation:
dans leur contenu ... (ce que zillow fait actuellement).Un peu bâclé, mais quelques modifications rapides pour rendre cela un peu plus intelligent sont:
Notez que cela ne va toujours qu'une redirection profonde. Pour aller plus loin, vous devez en fait obtenir le contenu et suivre les redirections.
la source
Parfois, vous devez obtenir des en-têtes HTTP, mais en même temps, vous ne voulez pas renvoyer ces en-têtes. **
Ce squelette prend en charge les cookies et les redirections HTTP en utilisant la récursivité. L'idée principale ici est d'éviter de renvoyer les en-têtes HTTP au code client.
Vous pouvez créer une classe curl très forte dessus. Ajouter la fonctionnalité POST, etc.
la source
Il y a beaucoup de regex ici, malgré le fait que je les aime vraiment de cette façon, cela pourrait être plus stable pour moi:
La partie emplacement est un lien dans le HTML envoyé par apache. Donc Xpath est parfait pour le récupérer.
la source
Vous pouvez utiliser:
la source