Ich versuche, Curl einer Umleitung zu folgen, aber ich kann es nicht ganz zum Laufen bringen. Ich habe eine Zeichenfolge, die ich als GET-Parameter an einen Server senden und die resultierende URL abrufen möchte.
Beispiel:
String = Kobold Vermin
Url = www.wowhead.com/search?q=Kobold+Worker
Wenn Sie zu dieser URL gehen, werden Sie zu "www.wowhead.com/npc=257" weitergeleitet. Ich möchte, dass curl diese URL zu meinem PHP-Code zurückgibt, damit ich das "npc = 257" extrahieren und verwenden kann.
Aktueller Code:
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);
}
Dies gibt jedoch www.wowhead.com/search?q=Kobold+Worker und nicht www.wowhead.com/npc=257 zurück .
Ich vermute, dass PHP zurückkehrt, bevor die externe Umleitung erfolgt. Wie kann ich das beheben?
curl
Übergeben Sie das Flag-L
oder, um Weiterleitungen mit dem Befehl automatisch zu verfolgen--location
. ZBcurl -L http://example.com/
Antworten:
Verwenden Sie Folgendes, um cURL einer Weiterleitung folgen zu lassen:
Ähm ... Ich glaube nicht, dass Sie die Locke tatsächlich ausführen ... Versuchen Sie:
curl_exec($ch);
... nach dem Einstellen der Optionen und vor dem
curl_getinfo()
Anruf.BEARBEITEN: Wenn Sie nur herausfinden möchten, wohin eine Seite umgeleitet wird, verwende ich den Rat hier und verwende Curl, um die Überschriften zu erfassen und die Überschrift Location: aus ihnen zu extrahieren:
quelle
Fügen Sie diese Linie zur Curl-Inizialisierung hinzu
und benutze getinfo vor curl_close
es:
quelle
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
ist eine Sicherheitslücke. Im Wesentlichen heißt es: "Ignorieren Sie die SSL-Fehler, wenn sie defekt sind - vertrauen Sie genauso wie einer unverschlüsselten URL."Die obige Antwort hat bei mir auf einem meiner Server nicht funktioniert, was mit basedir zu tun hat, also habe ich sie ein wenig überarbeitet. Der folgende Code funktioniert auf allen meinen Servern.
quelle
Location:
Header soll nicht immer einer Umleitung folgen. BitteDie hier gewählte Antwort ist anständig, unterscheidet jedoch zwischen Groß- und Kleinschreibung und schützt nicht vor relativen
location:
Überschriften (was einige Websites tun) oder Seiten,Location:
deren Inhalt möglicherweise tatsächlich den Ausdruck enthält ... (was zillow derzeit tut).Ein bisschen schlampig, aber ein paar schnelle Änderungen, um dies ein bisschen schlauer zu machen, sind:
Beachten Sie, dass dies immer noch nur 1 Umleitung tief geht. Um tiefer zu gehen, müssen Sie tatsächlich den Inhalt abrufen und den Weiterleitungen folgen.
quelle
Manchmal müssen Sie HTTP-Header abrufen, aber gleichzeitig möchten Sie diese Header nicht zurückgeben. **
Dieses Skelett kümmert sich um Cookies und HTTP-Weiterleitungen mithilfe von Rekursion. Die Hauptidee hierbei ist, zu vermeiden, dass HTTP-Header an den Clientcode zurückgegeben werden.
Sie können eine sehr starke Curl-Klasse darüber aufbauen. POST-Funktionalität usw. hinzufügen
quelle
Viele Regex hier, obwohl ich sie wirklich mag, könnte für mich stabiler sein:
Der Positionsteil ist ein Link im HTML-Code, der von Apache gesendet wird. Xpath ist also perfekt, um es wiederherzustellen.
quelle
Sie können verwenden:
quelle