Saya mencoba membuat ikal mengikuti pengalihan tetapi saya tidak bisa membuatnya berfungsi dengan benar. Saya memiliki string yang ingin saya kirim sebagai param GET ke server dan dapatkan URL yang dihasilkan.
Contoh:
String = Kobold Vermin
Url = www.wowhead.com/search?q=Kobold+Worker
Jika Anda membuka url itu, ia akan mengarahkan Anda ke "www.wowhead.com/npc=257". Saya ingin curl mengembalikan URL ini ke kode PHP saya sehingga saya dapat mengekstrak "npc = 257" dan menggunakannya.
Kode saat ini:
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);
}
Namun ini mengembalikan www.wowhead.com/search?q=Kobold+Worker dan bukan www.wowhead.com/npc=257 .
Saya menduga PHP akan kembali sebelum pengalihan eksternal terjadi. Bagaimana saya bisa memperbaikinya?
curl
perintah, lewati tanda-L
atau--location
. Misalnyacurl -L http://example.com/
Jawaban:
Untuk membuat cURL mengikuti arahan ulang, gunakan:
Erm ... Saya tidak berpikir Anda benar-benar mengeksekusi curl ... Coba:
curl_exec($ch);
... setelah mengatur opsi, dan sebelum
curl_getinfo()
panggilan.EDIT: Jika Anda hanya ingin mencari tahu ke mana halaman dialihkan ke, saya akan menggunakan saran di sini , dan hanya menggunakan Curl untuk mengambil header dan mengekstrak Lokasi: header dari mereka:
sumber
Tambahkan baris ini ke curl inisialisasi
dan gunakan getinfo sebelum curl_close
es:
sumber
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
adalah kerentanan keamanan. Itu pada dasarnya mengatakan "Abaikan kesalahan SSL jika rusak - percayai sama seperti Anda akan URL tidak terenkripsi.".Jawaban di atas tidak bekerja untuk saya di salah satu server saya, sesuatu dengan to basedir, jadi saya kembali hash sedikit. Kode di bawah ini berfungsi di semua server saya.
sumber
Location:
header tidak selalu mengikuti redirect. Silakan juga lihat pertanyaan yang secara eksplisit tentang ini: curl follow location errorJawaban yang dipilih di sini layak tetapi sensitif hurufnya, tidak melindungi terhadap
location:
tajuk relatif (yang dilakukan beberapa situs) atau laman yang mungkin memiliki frasaLocation:
di kontennya ... (yang saat ini memang dimiliki zillow).Agak ceroboh, tetapi beberapa suntingan cepat untuk membuat ini sedikit lebih pintar adalah:
Perhatikan bahwa ini masih berlangsung hanya 1 redirection. Untuk lebih dalam, Anda benar-benar perlu mendapatkan konten dan mengikuti arahan ulang.
sumber
Terkadang Anda perlu mendapatkan tajuk HTTP tetapi pada saat yang sama Anda tidak ingin mengembalikan tajuk itu. **
Kerangka ini menangani cookie dan pengalihan HTTP menggunakan rekursi. Gagasan utama di sini adalah untuk menghindari mengembalikan tajuk HTTP ke kode klien.
Anda dapat membangun kelas keriting yang sangat kuat di atasnya. Tambahkan fungsionalitas POST, dll.
sumber
Lot of of regex di sini, meskipun sebenarnya saya sangat menyukai mereka dengan cara ini mungkin lebih stabil bagi saya:
Bagian lokasi adalah tautan dalam HTML yang dikirim oleh apache. Jadi Xpath sempurna untuk memulihkannya.
sumber
Kamu bisa memakai:
sumber