Estou tentando fazer o curl seguir um redirecionamento, mas não consigo fazê-lo funcionar direito. Eu tenho uma string que quero enviar como um parâmetro GET para um servidor e obter o URL resultante.
Exemplo:
String = URL do Verbo Kobold
= www.wowhead.com/search?q=Kobold+Worker
Se você acessar esse URL, ele o redirecionará para "www.wowhead.com/npc=257". Eu quero que o curl retorne esse URL ao meu código PHP para que eu possa extrair o "npc = 257" e usá-lo.
Código atual:
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);
}
No entanto, isso retorna www.wowhead.com/search?q=Kobold+Worker e não www.wowhead.com/npc=257 .
Eu suspeito que o PHP esteja retornando antes que o redirecionamento externo aconteça. Como posso consertar isso?
curl
comando, passe o sinalizador-L
ou--location
. Por exemplocurl -L http://example.com/
Respostas:
Para fazer o cURL seguir um redirecionamento, use:
Erm ... não acho que você esteja realmente executando o curl ... Tente:
curl_exec($ch);
... depois de definir as opções e antes da
curl_getinfo()
chamada.EDIT: Se você apenas deseja descobrir para onde uma página é redirecionada, eu usaria o conselho aqui e use o Curl para pegar os cabeçalhos e extrair o cabeçalho Location:
fonte
Adicione esta linha para enrolar a inicialização
e use getinfo antes de curl_close
es:
fonte
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
é uma vulnerabilidade de segurança. Essencialmente, diz "Ignore os erros de SSL se estiverem quebrados - confie no mesmo que você faria com um URL não criptografado".A resposta acima não funcionou para mim em um dos meus servidores, algo a ver com o basedir, então eu a refiz um pouco. O código abaixo funciona em todos os meus servidores.
fonte
Location:
cabeçalho nem sempre deve seguir um redirecionamento. Também consulte uma pergunta que é explicitamente sobre isso: onda erro de localização followA resposta escolhida aqui é decente, mas diferencia maiúsculas de minúsculas, não protege contra
location:
cabeçalhos relativos (o que alguns sites possuem) ou páginas que podem realmente ter a fraseLocation:
em seu conteúdo ... (o que atualmente ocorre atualmente).Um pouco desleixado, mas algumas edições rápidas para tornar isso um pouco mais inteligente são:
Observe que isso ainda é apenas um redirecionamento profundo. Para ir mais fundo, você realmente precisa obter o conteúdo e seguir os redirecionamentos.
fonte
Às vezes, você precisa obter cabeçalhos HTTP, mas ao mesmo tempo não deseja retornar esses cabeçalhos. **
Esse esqueleto cuida de cookies e redirecionamentos HTTP usando recursão. A idéia principal aqui é evitar o retorno de cabeçalhos HTTP para o código do cliente.
Você pode criar uma classe de ondulação muito forte sobre ela. Adicione funcionalidade POST, etc.
fonte
Muitos regex aqui, apesar de eu realmente gostar deles dessa maneira, podem ser mais estáveis para mim:
A parte do local é um link no HTML enviado pelo apache. Portanto, o Xpath é perfeito para recuperá-lo.
fonte
Você pode usar:
fonte