O HTTP é escrito pelo protocolo de transferência de hipertexto. A Web World Wide Web usa esse protocolo. Quase a maior parte do conteúdo que você vê no seu navegador é transmitida através do protocolo HTTP, como este artigo.
Os cabeçalhos HTTP são solicitações HTTP e núcleos correspondentes, e carrega informações sobre navegadores de clientes, páginas de solicitação, servidores etc.
Quando você digita um URL na barra de endereços do navegador, seu navegador será semelhante à seguinte solicitação HTTP:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Host: net.tutsplus.com
Agente de usuário: Mozilla/5.0 (Windows; U; Windows NT 6.1; En-US; RV: 1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Aceitar: texto/html, aplicação/xhtml+xml, aplicação/xml; q = 0,9,*/*; q = 0,8
Aceitar-Language: en-us, en; q = 0,5
Aceitar-se-codificador: gzip, deflate
Aceitar-Charset: ISO-8859-1, UTF-8; Q = 0,7,*; Q = 0,7
Keep-Alive: 300
Conexão: Keep-alive
Cookie: phpSessid = r2t5uvjq435r4q7iB3vtdjq120
Pragma: sem cache
Controle de cache: sem cache
A primeira linha é chamada de linha de solicitação. Ele descreve as informações básicas desta solicitação e o restante é de cabeçalhos HTTP.
Após a conclusão da solicitação, seu navegador poderá receber a seguinte resposta HTTP:
HTTP/1.x 200 OK
Codificação de transferência: rolada
Data: Sáb, 28 de novembro de 2009 04:36:25 GMT
Servidor: LitesPeed
Conexão: Feche
X-Powerd-By: W3 Total Cache/0.8
Pragma: público
Expira: SAT, 28 de novembro de 2009 05:36:25 GMT
ETAG: Pub1259380237; GZ
Controle de cache: max-AGE = 3600, público
Tipo de conteúdo: texto/html; charset = utf-8
Último modificado: SAT, 28 de novembro de 2009 03:50:37 GMT
X-Pingback: http://net.tutsplus.com/xmlrpc.php
Codificação de conteúdo: gzip
Variar: aceitar o codificação, biscoito, agente de usuário
<!-... restante do html ...->
A primeira linha é chamada de linha de status, seguida pelos cabeçalhos HTTP. Depois que a linha em branco é concluída, o conteúdo será emitido (neste caso, alguma saída HTML).
Mas você não pode ver cabeçalhos HTTP quando olha para o código -fonte da página, embora eles sejam enviados para o navegador junto com o que você pode ver.
Esta solicitação HTTP também envia alguns pedidos de recebimento de outros recursos, como imagens, arquivos CSS, arquivos JS etc.
Vamos dar uma olhada nos detalhes abaixo.
As seguintes extensões do Firefox podem ajudá -lo a analisar os cabeçalhos HTTP:
1. Firebug
2. Live HTTP cabeçalhos
3. Em Php:
Abaixo do artigo, você verá alguns exemplos de uso de demonstração de PHP.
A primeira linha, chamada de primeira linha, contém três partes:
As seções restantes são cada linha com um nome: par de valores. Eles contêm uma variedade de informações sobre solicitações e seu navegador. Por exemplo, o agente do usuário indica sua versão do navegador e o sistema operacional que você está usando. Acepção aceita informará ao servidor que sua navegação pode aceitar uma saída compactada semelhante ao GZIP.
A maioria desses cabeçalhos é opcional. As solicitações HTTP podem até ser reduzidas a isso:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Host: net.tutsplus.com
E você ainda pode receber uma resposta válida do servidor.
Os três tipos de solicitação mais comuns são: Get, Post and Head. Você já pode estar familiarizado com os dois primeiros durante o processo de escrita do HTML.
A maioria das html, imagens, js, css, ... que são transmitidas ao navegador são solicitadas através do método GET. É a principal maneira de obter dados.
Por exemplo, para obter um artigo do Nettus+, a primeira linha da solicitação HTTP geralmente se parece com o seguinte:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Depois que o HTML for carregado, o navegador enviará uma solicitação para obter a imagem, assim:
GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1
O formulário também pode ser enviado através do método GET. Aqui está um exemplo:
<form action=foo.php method=GET>
Primeiro nome: <nome de entrada = primeiro_name type = text />
Sobrenome: <nome de entrada = last_name type = text />
<Nome de entrada = Ação Tipo = Submete Valor = Enviar />
</morm>
Quando este formulário for enviado, a solicitação HTTP ficará assim:
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
...
Você pode enviar a entrada de formulário para o servidor, anexando -o à sequência de consultas.
Embora você possa anexar dados à URL através do método GET para transmiti -los para o servidor, é mais apropriado usar o post para enviar dados ao servidor em muitos casos. Não é realista enviar uma grande quantidade de dados por meio do GET e tem certas limitações.
É comum usar solicitações de postagem para enviar dados de formulário. Vamos alterar o exemplo acima para usar a postagem:
<form action=foo.php method=POST>
Primeiro nome: <nome de entrada = primeiro_name type = text />
Sobrenome: <nome de entrada = last_name type = text />
<Nome de entrada = Ação Tipo = Submete Valor = Enviar />
</morm>
O envio deste formulário criará uma solicitação HTTP da seguinte forma:
POST /foo.php HTTP/1.1
Anfitrião: localhost
Agente de usuário: Mozilla/5.0 (Windows; U; Windows NT 6.1; En-US; RV: 1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Aceitar: texto/html, aplicação/xhtml+xml, aplicação/xml; q = 0,9,*/*; q = 0,8
Aceitar-Language: en-us, en; q = 0,5
Aceitar-se-codificador: gzip, deflate
Aceitar-Charset: ISO-8859-1, UTF-8; Q = 0,7,*; Q = 0,7
Keep-Alive: 300
Conexão: Keep-alive
Referente: http: //localhost/test.php
Tipo de conteúdo: aplicativo/x-www-forma-urlncoded
Comprimento de conteúdo: 43
primeiro_name = john & last_name = doe & action = envie
Aqui estão três coisas a serem observadas:
As solicitações de método post também podem ser usadas no Ajax, aplicativos, Curl…. E todos os formulários de upload de arquivos são necessários para usar a postagem.
A cabeça e a obtenção são muito semelhantes, exceto que a cabeça não aceita a parte do conteúdo da resposta HTTP. Quando você envia uma solicitação de cabeça, significa que você só está interessado no cabeçalho HTTP, não no próprio documento.
Este método permite que o navegador determine se a página foi modificada e, portanto, controla o cache. Também pode ser determinado se o documento solicitado existe.
Por exemplo, se você tiver muitos links em seu site, poderá simplesmente enviar solicitações de cabeça separadamente para determinar se existem links mortos, o que é muito mais rápido do que o uso do GET.
Quando o navegador envia uma solicitação HTTP, o servidor responderá à solicitação por meio de uma resposta HTTP. Se você não se importa com o conteúdo, a solicitação ficará assim:
A primeira informação valiosa é o contrato. Atualmente, o servidor usará http/1.x ou http/1.1.
Em seguida, uma breve mensagem representa o status. Código 200 significa que nossa solicitação foi enviada com sucesso e o servidor retornará o documento solicitado após as informações do cabeçalho.
Todos nós vimos a página 404. Quando solicito um caminho que não existe do servidor, o servidor responde a nós com um 404 em vez de 200.
O restante da resposta é semelhante à solicitação HTTP. Estes são sobre software de servidor, quando páginas/arquivos foram modificados, tipo MIME, etc ...
Da mesma forma, essas informações do cabeçalho são opcionais.
Como mencionado acima, 200 é usado para indicar que a solicitação é bem -sucedida.
206 Conteúdo parcialSe um aplicativo solicitar apenas arquivos dentro de um determinado intervalo, ele retornará 206.
Isso geralmente é usado para download de gerenciamento, continuação do ponto de interrupção ou downloads de chunking de arquivos.
404 não encontradoÉ fácil de entender
401 não autorizadoAs páginas protegidas por senha retornarão a esse status. Se você não inserir a senha correta, verá as seguintes informações em seu navegador:
Observe que esta é apenas uma página protegida por senha. A caixa pop-up que solicita inserir uma senha se parece com a seguinte:
403 ProibidoSe você não tiver permissão para acessar uma página, ele retornará ao status 403. Isso geralmente acontece quando você tenta abrir uma pasta sem uma página de índice. Se as configurações do servidor não permitirem visualização do conteúdo do diretório, você verá um erro 403.
Outros métodos também enviam restrições de permissão, como você pode bloqueá -las através do seu endereço IP, o que requer alguma assistência em htaccess.
order allow,deny
negar de 192.168.44.201
negar de 224.39.163.12
negar de 172.16.7.92
permitir de todos
302 (ou 307) movido temporariamente e 301 movido permanentementeEsses dois estados aparecerão quando o navegador redirecionar. Por exemplo, você usa um serviço de encurtamento de URL como Bit.ly. É também assim que eles sabem quem clicou no link deles.
302 e 301 são muito semelhantes aos navegadores, mas existem algumas diferenças para os rastreadores de mecanismos de pesquisa. Por exemplo, se o seu site estiver sendo mantido, você redirecionará o navegador do cliente para outro endereço com 302. Os rastreadores de mecanismos de pesquisa reiniciarão sua página no futuro. Mas se você usar o redirecionamento 301, significa que você informa ao rastreador de mecanismo de pesquisa: seu site foi movido permanentemente para o novo endereço.
Erro do servidor 500 (erro interno do servidor)Esse código geralmente aparece quando o script da página trava. A maioria dos scripts CGI não produz mensagens de erro para o navegador como o PHP. Se ocorrer um erro fatal, eles enviarão apenas um código de status de 500. Nesse momento, você precisará verificar o log de erros do servidor para solucionar problemas.
Lista completaVocê pode encontrar o código de status HTTP completo Descrição aqui. Ou verifique aqui (http://tools.vevb.com/table/http_status_code).
Agora, vejamos algumas informações comuns de solicitação HTTP nos cabeçalhos HTTP.
Todas essas informações do cabeçalho podem ser encontradas na matriz $ _Server do PHP. Você também pode usar a função getAllHeader () para obter todas as informações do cabeçalho de uma só vez.
Uma solicitação HTTP será enviada para um endereço IP específico, mas a maioria dos servidores tem a capacidade de hospedar vários sites no mesmo endereço IP; portanto, o servidor deve saber qual nome de domínio as solicitações do navegador.
Host: rlog.cn
Este é apenas um nome básico do host, incluindo nomes de domínio e nomes de domínio infantil.
No PHP, você pode visualizá -lo via $ _server ['http_host'] ou $ _server ['server_name'].
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Esta cabeça pode transportar as seguintes informações:
Este é o método geral usado por alguns sites para coletar informações do visitante. Por exemplo, você pode saber se um visitante está usando seu telefone para visitar seu site e depois decidir se deve direcioná -lo para um site móvel que tenha um bom desempenho em baixa resolução.
No PHP, o agente do usuário pode ser obtido através de $ _Server ['http_user_agent']
if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
eco, por favor, pare de usar o IE6!;
}
Accept-Language: en-us,en;q=0.5
Essas informações podem indicar as configurações de idioma padrão do usuário. Se o site tiver uma versão de idioma diferente, você poderá usar essas informações para redirecionar o navegador do usuário.
Pode ser transportado em vários idiomas por segmentação de vírgula. O primeiro será o idioma preferido e outros idiomas terão um valor Q para indicar a preferência do usuário pelo idioma (0 ~ 1).
Use $ _Server [http_accept_language] no PHP para obter essas informações.
if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {
Cabeçalho ('Localização: http://french.mydomain.com');
}
Accept-Encoding: gzip,deflate
A maioria dos navegadores modernos suporta compactação GZIP e relatará essas informações ao servidor. Neste momento, o HTML compactado será enviado para o navegador. Isso pode reduzir o tamanho do arquivo em quase 80% para economizar tempo de download e largura de banda.
Esta informação pode ser obtida usando $ _server [http_accept_encoding] no PHP. Em seguida, o valor será detectado automaticamente quando o método ob_gzhandler () for chamado, para que você não precise detectá -lo manualmente.
// enables output buffering
// e toda a saída é compactada se o navegador suportar
ob_start ('ob_gzhandler');
Se uma página tiver sido armazenada em cache no seu navegador, na próxima vez que você navegar, o navegador verificará se o documento foi modificado e enviará um cabeçalho como este:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
Se não tiver sido modificado desde o momento, o servidor retornará 304 não modificado e não retornará o conteúdo. O navegador lerá automaticamente o conteúdo no cache
No PHP, você pode usar $ _Server ['http_if_modified_since'] para detectar.
// assume $last_modify_time was the last the output was updated
// O navegador enviou um cabeçalho se modificado-uma vez?
if (isset ($ _ server ['http_if_modified_since'])) {
// Se o cache do navegador corresponder ao tempo modificado
if ($ last_modify_time == strtotime ($ _ servidor ['http_if_modified_since'])) {
// Envie um cabeçalho 304 e sem conteúdo
cabeçalho (http/1.1 304 não modificado);
saída;
}
}
Há também um cabeçalho HTTP chamado ETAG, que é usado para determinar se as informações em cache estão corretas e explicaremos mais tarde.
Como o nome indica, ele enviará informações de cookies armazenadas no seu navegador para o servidor.
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar
É um conjunto de pares de nomes-valor divididos por semicolons. Os cookies também podem incluir ID da sessão.
No PHP, um único cookie pode ser obtido acessando a matriz $ _cookie. Você pode usar diretamente a matriz $ _Session para obter a variável da sessão. Se você precisar do ID da sessão, poderá usar a função session_id () em vez do cookie.
echo $_COOKIE['foo'];
// saída: barra
echo $ _cookie ['phpsessid'];
// saída: r2t5uvjq435r4q7ib3vtdjq120
session_start ();
echo session_id ();
// saída: r2t5uvjq435r4q7ib3vtdjq120
Como o nome indica, o cabeçalho conterá informações de URL de referência.
Por exemplo, visitei a página inicial do Nettus+ e cliquei em um link, e esse cabeçalho será enviado ao navegador:
Referer: http://net.tutsplus.com/
No PHP, o valor pode ser obtido por $ _Server ['http_referer'].
if (isset($_SERVER['HTTP_REFERER'])) {
$ url_info = parse_url ($ _ server ['http_referer']);
// O surfista vem do Google?
if ($ url_info ['host'] == 'www.google.com') {
parse_str ($ url_info ['Query'], $ vars);
eco que você pesquisou no google para esta palavra -chave :. $ vars ['q'];
}
}
// Se o URL de referência foi:
// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9
// A saída será:
// Você pesquisou no Google por esta palavra -chave: cabeçalhos http
Você deve ter notado que a palavra referenciador é incorreta como referente. Infelizmente, ele fez as especificações oficiais do HTTP como essa e ficou preso.
Quando uma página requer autorização, o navegador exibe uma janela de login. Depois de inserir a conta correta, o navegador enviará uma solicitação HTTP, mas conterá um cabeçalho:
Authorization: Basic bXl1c2VyOm15cGFzcw==
Esta parte das informações contidas no cabeçalho é baseada em base64. Por exemplo, BASE64_DECODE ('BXL1C2VYOM15CGFZCW ==') será convertido para 'MyUser: MyPass'.
No PHP, esse valor pode ser obtido com $ _server ['php_auth_user'] e $ _server ['php_auth_pw'].
Explicaremos mais detalhes na seção www-autenticate.
Agora, deixe -me entender algumas informações de resposta HTTP em cabeçalhos HTTP comuns.
No PHP, você pode definir as informações de resposta do cabeçalho através do cabeçalho (). O PHP enviou automaticamente algumas informações de cabeçalho necessárias, como conteúdo carregado, configuração de cookies, etc ... Você pode ver o enviado e ser enviado pela função Headers_List (). Você também pode usar a função headers_sent () para verificar se as informações do cabeçalho foram enviadas.
W3.org é definido como: O campo de cabeçalho geral do controle de cache é usado para especificar diretivas que devem ser obedecidas por todos os mecanismos de cache ao longo da cadeia de solicitação/resposta. Onde os mecanismos de cache contém algumas informações de gateway e proxy que seu ISP pode usar.
Por exemplo:
Cache-Control: max-age=3600, public
Público significa que a resposta pode ser armazenada em cache por qualquer pessoa, e o máximo indica o número de segundos que o cache é válido. Permite que seu site seja armazenado em cache para reduzir bastante o tempo de download e a largura de banda, além de melhorar a velocidade de carregamento do navegador.
Você também pode desativar o cache definindo o comando sem cache:
Cache-Control: no-cache
Para mais detalhes, consulte W3.org.
Este cabeçalho contém o tipo MIME do documento. O navegador decidirá como analisar o documento com base neste parâmetro. Por exemplo, uma página HTML (ou uma página PHP com saída HTML) retornará algo assim:
Content-Type: text/html; charset=UTF-8
'Texto' é o tipo de documento e 'html' é o subtipo de documento. Este cabeçalho também inclui mais informações, como o Charset.
Se for uma imagem, uma resposta como essa será enviada:
Content-Type: image/gif
O navegador pode usar o tipo MIME para decidir se deve usar programas externos ou estender o próprio documento. O exemplo a seguir reduz a chamada para o Adobe Reader:
Content-Type: application/pdf
Carregar diretamente, o Apache geralmente julga automaticamente o tipo MIME do documento e adiciona informações apropriadas ao cabeçalho. Além disso, a maioria dos navegadores tem um certo grau de tolerância a falhas. Se o cabeçalho não fornecer ou fornecer as informações incorretamente, ele detectará automaticamente o tipo MIME.
Você pode encontrar uma lista de tipos de mímica comumente usados aqui.
No PHP, você pode usar o FINFO_FILE () para detectar o tipo IME do arquivo.
Este cabeçalho dirá ao navegador para abrir uma janela de download de arquivos em vez de tentar analisar o conteúdo da resposta. Por exemplo:
Content-Disposition: attachment; filename=download.zip
Isso faz com que o navegador tenha uma caixa de diálogo como esta:
Observe que as informações do cabeçalho do tipo de conteúdo que se adaptam também serão enviadas.
Content-Type: application/zip
Disposição de conteúdo: anexo; arquivo de arquivo = download.zip
Quando o conteúdo deve ser transferido para o navegador, o servidor pode usar esse cabeçalho para informar o navegador do tamanho (bytes) do arquivo a ser transferido.
Content-Length: 89123
Esta informação é bastante útil para downloads de arquivos. É por isso que o navegador conhece o progresso do download.
Por exemplo, aqui escrevi um script virtual para simular um download lento.
// it's a zip file
cabeçalho ('Tipo de conteúdo: aplicativo/zip');
// 1 milhão de bytes (cerca de 1megabyte)
Cabeçalho ('Length-Length: 1000000');
// Carregar uma caixa de diálogo de download e salve -a como download.zip
Cabeçalho ('Content-Disposition: Anexment; FileName = Download.zip');
// 1000 vezes 1000 bytes de dados
para ($ i = 0; $ i <1000; $ i ++) {
echo str_prepeat (., 1000);
// Durma para desacelerar o download
USleep (50000);
}
O resultado será assim:
Agora, eu comento o cabeçalho do comprimento do conteúdo:
// it's a zip file
cabeçalho ('Tipo de conteúdo: aplicativo/zip');
// O navegador não saberá o tamanho
// cabeçalho ('Length-comprimento: 1000000');
// Carregar uma caixa de diálogo de download e salve -a como download.zip
Cabeçalho ('Content-Disposition: Anexment; FileName = Download.zip');
// 1000 vezes 1000 bytes de dados
para ($ i = 0; $ i <1000; $ i ++) {
echo str_prepeat (., 1000);
// Durma para desacelerar o download
USleep (50000);
}
O resultado se tornou o seguinte:
Este navegador apenas informará o quanto você baixou, mas não informa quanto você precisa baixar no total. E a barra de progresso não mostrará progresso.
Esta é outra informação de cabeçalho gerada para cache. Vai ficar assim:
Etag: pub1259380237;gz
O servidor pode responder a essas informações com cada arquivo enviado ao navegador. Este valor pode conter a última data modificada, tamanho do arquivo ou soma de arquivo do documento. A navegação irá cache -o com o documento recebido. Na próxima vez que o navegador solicitar o mesmo arquivo novamente, a seguinte solicitação HTTP será enviada:
If-None-Match: pub1259380237;gz
Se o valor ETAG do documento solicitado for consistente com ele, o servidor enviará um código de status 304 em vez de 2oo. E nenhum conteúdo é retornado. O navegador carregará o arquivo do cache neste momento.
Como o nome sugere, esta informação do cabeçalho usa o formato GMT para indicar o último tempo de modificação do documento:
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
$modify_time = filemtime($file);
Cabeçalho (Último modificado :. Gmdate (D, D myh: i: s, $ modify_time).
Fornece outro mecanismo de cache. O navegador pode enviar uma solicitação como esta:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
Já discutimos isso na seção IF-modificada.
Este cabeçalho é usado para redirecionamento. Se o código de resposta for 301 ou 302, o servidor deverá enviar o cabeçalho. Por exemplo, quando você visita http://www.nettus.com, o navegador receberá a seguinte resposta:
HTTP/1.x 301 Moved Permanently
...
Localização: http://net.tutsplus.com/
...
No PHP, você pode redirecionar os visitantes dessa maneira:
header('Location: http://net.tutsplus.com/');
Por padrão, o código de status 302 será enviado. Se você quiser enviar 301, escreva assim:
header('Location: http://net.tutsplus.com/', true, 301);
Quando um site precisa definir ou atualizar as informações de cookies que você navega, ele usará esse cabeçalho:
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
Set-cookie: session-id = 120-7333518-8165026; caminho =/; domínio = .amazon.com; Expira = Sáb 27 de fevereiro 08:00:00 2010 GMT
Cada cookie será usado como um cabeçalho separado. Observe que a configuração de cookies através do JS não será refletida no cabeçalho HTTP.
No PHP, você pode definir cookies através da função setCookie () e o PHP enviará cabeçalhos HTTP apropriados.
setcookie(TestCookie, foobar);
Ele enviará um cabeçalho como este:
Set-Cookie: TestCookie=foobar
Se o tempo de validade não for especificado, o cookie será excluído após o fechamento do navegador.
Um site pode enviar esta informação do cabeçalho sobre o HTTP para verificar os usuários. Uma janela pop-up será aberta quando o navegador vir essa resposta na cabeça.
WWW-Authenticate: Basic realm=Restricted Area
Vai ficar assim:
Em um capítulo do manual do PHP, existe um código simples que demonstra como fazer algo assim com PHP:
if (!isset($_SERVER['PHP_AUTH_USER'])) {
cabeçalho ('www-autenticate: reino básico = meu reino');
cabeçalho ('http/1.0 401 não autorizado');
eco 'texto para enviar se hits de usuário cancelar o botão';
saída;
} outro {
echo <p> Olá {$ _server ['php_auth_user']}. </p>;
eco <p> você entrou {$ _server ['php_auth_pw']} como sua senha. </p>;
}
Esse cabeçalho geralmente é definido quando o conteúdo de retorno é compactado.
Content-Encoding: gzip
No PHP, se você chamar a função ob_gzhandler (), este cabeçalho será definido automaticamente.
Endereço original: http://css9.net/all-about-http theaders/