Respostas HTTP curl e wget resultados diferentes

4

Para verificar o cabeçalho de resposta HTTP de um conjunto de URLs enviei os seguintes cabeçalhos de solicitação

foreach ( $urls as $url )
{
    // Setup headers - I used the same headers from Firefox version 2.0.0.6
    $header[ ] = "Accept: text/xml,application/xml,application/xhtml+xml,";
    $header[ ] = "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[ ] = "Cache-Control: max-age=0";
    $header[ ] = "Connection: keep-alive";
    $header[ ] = "Keep-Alive: 300";
    $header[ ] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[ ] = "Accept-Language: en-us,en;q=0.5";
    $header[ ] = "Pragma: "; // browsers keep this blank.

    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)');
    curl_setopt( $ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt( $ch, CURLOPT_REFERER, 'http://www.google.com');
    curl_setopt( $ch, CURLOPT_HEADER, true );
    curl_setopt( $ch, CURLOPT_NOBODY, true );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY );
    curl_setopt( $ch, CURLOPT_TIMEOUT, 10 ); //timeout 10 seconds
}

Às vezes eu recebo 200 OK, o que é bom em outras ocasiões 301, 302, 307, o que considero bom também, mas outras vezes recebo status estranho como 406, 500, 504, que deve identificar um URL inválido, mas quando abro o navegador eles estão bem

por exemplo, o script retorna

http://www.awe.co.uk/ => HTTP/1.1 406 Not Acceptable

e retornos do wget

wget http://www.awe.co.uk/
--2011-06-23 15:26:26--  http://www.awe.co.uk/
Resolving www.awe.co.uk... 77.73.123.140
Connecting to www.awe.co.uk|77.73.123.140|:80... connected.
HTTP request sent, awaiting response... 200 OK

Alguém sabe qual cabeçalho de solicitação estou perdendo ou adicionando em excesso?

    
por Fab 23.06.2011 / 16:32

3 respostas

5

Você está incluindo cabeçalhos HTTP inválidos em sua solicitação:

$header[ ] = "Accept: text/xml,application/xml,application/xhtml+xml,";
$header[ ] = "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";

Na primeira linha, a lista termina com um , - ou seja, um tipo de conteúdo vazio - que é a causa de 406 erros Não aceitável . A segunda linha não é sequer um cabeçalho HTTP.

Se você estava olhando para conversas HTTP do Firefox com um sniffer de pacotes, provavelmente viu algo assim:

Accept: text/xml,application/xml,application/xhtml+xml,
    text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

Como a segunda linha começa com espaço em branco, eles são tratados como um único cabeçalho pelo servidor. Eles também devem ser passados como um cabeçalho para enrolar:

$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";

Você pode usar o link para comparar as solicitações enviadas.

    
por 23.06.2011 / 19:40
1

Você não está fornecendo um Host: no seu array header[] . Em solicitações HTTP 1.1 para servidores de conteúdo, Host: cabeçalhos são obrigatórios. As respostas não-4xx são onde você acertou o servidor HTTP de conteúdo de alguém que é indulgente quando se trata deste erro de protocolo.

    
por 23.06.2011 / 18:26
0

Na minha humilde opinião, o seu roteiro parece ok e, como às vezes você está obtendo os resultados corretos, ele deve estar funcionando.

Você é o proprietário de http://www.awe.co.uk/ ?
Talvez haja um script em execução que decida o que fazer dependendo de alguns env's. Por exemplo, em seu script, você está acessando este site como user-agent "googlebot", enquanto seu user agent wget será "wget". O script no servidor da web pode verificar se é o Google e oferece um conteúdo completamente diferente do que o seu navegador pode ver. Da mesma forma, o servidor da Web pode enviar códigos de retorno diferentes.
Para testar esse problema, você pode querer reduzir seu script ou estender o comando wget para enviar a mesma solicitação e comparar os resultados.

Outra coisa que posso imaginar: com que frequência você executou seu roteiro? Talvez o servidor web tenha notado o enorme tráfego do seu script e envie 406 (ou algum outro material) se você estiver exagerando; -)

    
por 23.06.2011 / 17:27

Tags