PHP file_get_contents () e definindo cabeçalhos de solicitação

121

Com o PHP, é possível enviar cabeçalhos HTTP com file_get_contents()?

Eu sei que você pode enviar o agente do usuário a partir do seu php.iniarquivo. No entanto, você também pode enviar outras informações, como HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGEe HTTP_CONNECTIONcom file_get_contents()?

Ou existe outra função que realizará isso?

Marcus
fonte

Respostas:

318

Na verdade, depois de ler mais sobre a file_get_contents()função:

// Create a stream
$opts = [
    "http" => [
        "method" => "GET",
        "header" => "Accept-language: en\r\n" .
            "Cookie: foo=bar\r\n"
    ]
];

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://www.example.com/', false, $context);

Você pode seguir esse padrão para alcançar o que está procurando, mas eu ainda não testei isso pessoalmente. (e se não funcionar, fique à vontade para conferir minha outra resposta)

Dominic Barnes
fonte
18
esta a resposta só é útil desta página
Gordon
9
Desejo que mais pessoas aqui dêem a resposta real a esta pergunta, em vez de apenas apontarem para a página cURL. Obrigado.
Merijn
3
de repente curioso: qual é o agente de usuário padrãofile_get_contents() ? especifica um?
Raptor
5
@Raptor ini_set('user_agent', 'SomeBrowser v42.0.4711');ir para user-agent.me e copiar seu a partir de lá .. ou editar php.ini para mudá-la globalmente
jaggedsoft
88

Aqui está o que funcionou para mim (Dominic era apenas uma linha curta).

$url = "";

$options = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n" .  // check function.stream-context-create on php.net
              "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad 
  )
);

$context = stream_context_create($options);
$file = file_get_contents($url, false, $context);
Fabrice
fonte
6
Você não deve se passar por um agente de usuário de um navegador. Em vez disso, crie uma sequência de User-Agent para sua ferramenta. www-archive.mozilla.org/build/revised-user-agent-strings.html pode dar uma idéia sobre o formato.
Dereckson
1
@Vince Acho que pode funcionar nos dois sentidos em determinadas circunstâncias. Definir o cabeçalho de agente assim, como uma string, trabalhou no meu caso (WAF necessário agente de usuário não vazio para pedido para passar)
dhaupin
3
@Vince Os documentos do PHP afirmam que ambos podem ser usados ​​e o "User-Agent" headersubstituirá o user_agentelemento da matriz, se ambos forem especificados.
MrWhite 5/17/17
NOTA: Nunca use aspas simples com strings contendo caracteres especiais como \ n ou \ r. O PHP não as interpretará corretamente e, no caso de enviar cabeçalhos, seus cabeçalhos não serão enviados corretamente.
ak93
1
@Fanky o mais simples pode ser "YourTool / 1.0.0". Quando você libera uma nova versão, também pode aumentar a versão do agente do usuário, "YourTool / 1.3.5".
Dereckson
39

Você pode usar essa variável para recuperar cabeçalhos de resposta após file_get_contents() função.

Código:

  file_get_contents("http://example.com");
  var_dump($http_response_header);

Resultado:

array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
  [2]=>
  string(29) "Server: Apache/2.2.3 (CentOS)"
  [3]=>
  string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
  [4]=>
  string(27) "ETag: "280100-1b6-80bfd280""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 438"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(38) "Content-Type: text/html; charset=UTF-8"
}
ali_sed
fonte
6
isso não responde à pergunta.
Gordon
32
Talvez não, mas responde à pergunta oposta implícita no título, que é como ler os cabeçalhos de resposta de file_get_contents. E é aqui que o Google chega ao investigar essa pergunta.
Rich Remer
0

Sim.

Ao chamar file_get_contentsum URL, deve-se usar ostream_create_context função, que está bastante bem documentada no php.net.

Isso é abordado mais ou menos exatamente na página a seguir em php.net na seção de comentários do usuário: http://php.net/manual/en/function.stream-context-create.php

Laereom
fonte
-1

Usar as bibliotecas php cURL provavelmente será o caminho certo a seguir, pois essa biblioteca possui mais recursos do que o simples file_get_contents(...).

Um exemplo:

<?php
$ch = curl_init();
$headers = array('HTTP_ACCEPT: Something', 'HTTP_ACCEPT_LANGUAGE: fr, en, da, nl', 'HTTP_CONNECTION: Something');

curl_setopt($ch, CURLOPT_URL, "http://localhost"); # URL to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt($ch, CURLOPT_HTTPHEADER, $header ); # custom headers, see above
$result = curl_exec( $ch ); # run!
curl_close($ch);
?>
phidah
fonte
5
O snippet que você mostra também é fácil de obter file_get_contentse ainda preciso encontrar um Caso de Uso que você só pode obter com cURL.
21712 Gordon
-1

Se você não precisar de HTTPS e o curl não estiver disponível no seu sistema, poderá usar fsockopen

Esta função abre uma conexão a partir da qual você pode ler e escrever, como faria com um identificador de arquivo normal.

AlexB
fonte
2
sim, mas também significaria que o OP deve implementar o protocolo HTTP manualmente. Além disso, o OP não perguntou sobre alternativas, file_get_contentsentão essa é uma resposta fora do tópico.
21712 Gordon
-3

Infelizmente, não parece file_get_contents()oferecer realmente esse grau de controle. A extensão cURL é geralmente a primeira a aparecer, mas eu recomendo a extensão PECL_HTTP ( http://pecl.php.net/package/pecl_http ) para solicitações HTTP muito simples e diretas. (é muito mais fácil trabalhar do que cURL)

Dominic Barnes
fonte