Cabeçalhos HTTP são importantes para controlar como o cache e os navegadores processam seu conteúdo. Mas muitos deles são usados incorretamente ou sem sentido, gastando recursos extras em um momento crítico do carregamento da página e podem não funcionar como você pensa. Em uma série de artigos sobre práticas recomendadas, examinaremos primeiro as manchetes desnecessárias.
A maioria dos desenvolvedores está ciente dos cabeçalhos HTTP importantes e úteis. Os mais famosos são o
Content-Type
Content-Length
, são cabeçalhos quase universais. Recentemente, porém, cabeçalhos como
Content-Security-Policy
e
Strict-Transport-Security
foram usados para aumentar a
Strict-Transport-Security
e
Link rel=preload
para melhorar o desempenho. Apesar do amplo suporte nos navegadores, apenas alguns os utilizam.
Ao mesmo tempo, existem muitas manchetes extremamente populares que geralmente não são novas e não são muito úteis. Podemos provar isso com a ajuda do
HTTP Archive , um projeto executado pelo Google e patrocinado pela Fastly, que baixa 500.000 sites todos os meses usando o
WebPageTest e carrega os resultados no
BigQuery .
Aqui estão os 30 cabeçalhos de resposta mais populares de acordo com o HTTP Archive (com base no número de domínios no archive que cada cabeçalho exibe) e uma estimativa aproximada da utilidade de cada um deles:
Manchete | Inquéritos | Domínios | Status |
---|
data | 48779277 | 535621 | Protocolo necessário |
tipo de conteúdo | 47185627 | 533636 | Geralmente exigido pelo navegador |
servidor | 43057807 | 519663 | Opcional |
comprimento do conteúdo | 42388435 | 519118 | Útil |
modificado pela última vez | 34424562 | 480294 | Útil |
controle de cache | 36490878 | 412943 | Útil |
etag | 23620444 | 412370 | Útil |
codificação de conteúdo | 16194121 | 409159 | Necessário para conteúdo compactado |
expira | 29869228 | 360311 | Opcional |
x-powered-by | 4883204 | 211409 | Opcional |
pragma | 7641647 | 188784 | Opcional |
x-frame-options | 3670032 | 105846 | Opcional |
access-control-allow-origin | 11335681 | 103596 | Útil |
x-content-type-options | 11071560 | 94590 | Útil |
link | 1212329 | 87475 | Útil |
idade | 7401415 | 59242 | Útil |
x-cache | 5275343 | 56889 | Opcional |
x-xss-protection | 9773906 | 51810 | Útil |
segurança de transporte estrita | 4259121 | 51283 | Útil |
via | 4020117 | 47102 | Opcional |
p3p | 8282840 | 44308 | Opcional |
expect-ct | 2685280 | 40465 | Útil |
idioma do conteúdo | 334081 | 37927 | Controverso |
x-aspnet-version | 676128 | 33473 | Opcional |
access-control-allow-credentials | 2804382 | 30346 | Útil |
x-robots-tag | 179177 | 24911 | Não importa para navegadores |
compatível com x-ua | 489056 | 24811 | Opcional |
métodos de controle de acesso e permissão | 1626129 | 20791 | Útil |
acesso-controle-permitir-cabeçalhos | 1205735 | 19120 | Útil |
Vejamos os cabeçalhos opcionais, por que não precisamos deles e o que fazer sobre isso.
Vaidade (servidor, alimentado por x, via)
Você pode ter muito orgulho da sua escolha de software para servidor, mas a maioria das pessoas não se importa. Na pior das hipóteses, esses cabeçalhos podem divulgar dados confidenciais, facilitando o ataque ao site.
Server: apache
X-Powered-By: PHP/5.1.1
Via: 1.1 varnish, 1.1 squid
O RFC7231 permite incluir o cabeçalho do servidor na resposta do servidor, indicando o software específico no servidor usado para entregar o conteúdo. Na maioria das vezes, essa é uma string como "apache" ou "nginx". Embora o título seja permitido, ele é opcional e não é particularmente valioso para desenvolvedores ou usuários finais. No entanto, hoje é o terceiro cabeçalho do servidor HTTP mais popular da Internet.
X-Powered-By
é o título mais popular que não é definido por nenhum padrão e tem uma finalidade semelhante: geralmente indica a plataforma de aplicativos na qual o servidor está sendo executado. As respostas mais populares incluem "ASP.net", "PHP" e "Express". Novamente, isso não traz benefícios tangíveis e apenas ocorre.
Talvez mais controverso possa ser considerado na
Via
. É necessário (de
acordo com o RFC7230 ) adicionar à
solicitação cada proxy pelo qual a solicitação passa - para identificar o proxy. Pode ser o nome do host proxy, mas com mais freqüência um identificador genérico como "vegur", "verniz" ou "squid". Remover (ou não adicionar) esse cabeçalho pode levar a um
ciclo de encaminhamento de proxy . Mas é interessante que ele também seja adicionado em resposta ao caminho de retorno ao navegador - e aqui ele simplesmente executa uma função de informação: nenhum navegador faz nada com ele, por isso é seguro o suficiente para se livrar dele, se você quiser.
Padrões Descontinuados (P3P, Expira, Opções de Quadro X, Compatível com X-UA)
Outra categoria de cabeçalhos são aqueles que realmente causam um efeito no navegador, mas (já) não são a melhor maneira de obter esse efeito.
P3P: cp="this is not a p3p policy"
Expires: Thu, 01 Dec 1994 16:00:00 GMT
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=edge
P3P
é uma coisinha divertida. Eu não tinha ideia do que era. Ainda mais engraçado, um dos conteúdos mais comuns do cabeçalho P3P é "Esta não é uma regra do P3P". Bem, é isso ou não?
Aqui, a história remonta a
uma tentativa de padronizar as regras de privacidade legíveis por máquina . Houve discordância sobre como exibir dados nos navegadores e apenas um navegador implementou o suporte para esse cabeçalho - o Internet Explorer. Mas mesmo nele, o P3P não teve efeito visual para o usuário; ele só precisava estar presente para permitir o acesso a cookies de terceiros nos quadros. Alguns sites até definem regras de não conformidade do P3P, como no exemplo acima, embora isso seja
altamente questionável .
Escusado será dizer que a leitura de cookies de terceiros geralmente é uma má ideia; portanto, se você não o fizer, não precisará definir o cabeçalho
P3P
!
Expires
simplesmente incrivelmente popular, considerando que o
Cache-Control
é superior ao
Expires
há mais de 20 anos. Se o cabeçalho de
Cache-Control
contiver a diretiva de
max-age
, qualquer cabeçalho de
Expires
na mesma resposta será ignorado. Porém, um grande número de sites define esses dois cabeçalhos e
Expires
mais freqüência a data
Thu, 01 Dec 1994 16: 00: 00 GMT
, para que o conteúdo não seja armazenado em cache. Obviamente, é mais fácil copiar a data
das especificações .

Mas simplesmente não há necessidade de fazer isso. Se você tiver um cabeçalho
Expires
com uma data do passado, basta substituí-lo por:
Cache-Control: no-store, private
(
no-store
é uma diretiva muito estrita para não gravar conteúdo em armazenamento persistente, portanto, você pode preferir
no-cache
para obter melhor desempenho, por exemplo, para navegar para frente / para trás ou retomar as guias inativas em um navegador)
Algumas ferramentas de validação de site recomendam que você adicione um cabeçalho
X-Frame-Options
com o valor 'SAMEORIGIN'. Ele informa aos navegadores que você se recusa a enviar conteúdo para um quadro em outro site: como regra geral, essa é uma boa defesa contra o
clickjacking . Mas o mesmo efeito pode ser alcançado com outro cabeçalho com suporte mais consistente e comportamento mais confiável:
Content-Security-Policy: frame-ancestors 'self'
Há um benefício adicional aqui, porque você ainda precisa fornecer o cabeçalho do CSP por outros motivos (mais sobre eles mais tarde). Provavelmente, em nosso tempo, você pode ficar sem o
X-Frame-Options
.
Por fim, no IE9, a Microsoft introduziu um "modo de compatibilidade" que renderizou a página usando o mecanismo IE8 ou IE7. Mesmo no modo normal, o navegador considerava que uma versão mais antiga do mecanismo poderia ser necessária para a renderização adequada. Essas heurísticas nem sempre funcionavam corretamente, e os desenvolvedores podiam substituí-las usando o cabeçalho ou a metatag
X-UA-Compatible
com
X-UA-Compatible
. De fato, isso se tornou parte padrão de muitas estruturas, como o Bootstrap. Agora, esse cabeçalho é praticamente inútil: a proporção de navegadores que o entendem é muito pequena. E se você apoia ativamente o site, é muito improvável que ele use tecnologias que iniciem o modo de compatibilidade.
Depurando dados (versão X-ASPNet, cache X)
De certa forma, é surpreendente que alguns dos títulos mais populares não sejam mencionados em nenhum padrão. Essencialmente, isso significa que milhares de sites de alguma forma concordaram em usar um determinado cabeçalho de uma certa maneira.
X-Cache: HIT
X-Request-ID: 45a336c7-1bd5-4a06-9647-c5aab6d5facf
X-ASPNet-Version: 3.2.32
X-AMZN-RequestID: 0d6e39e2-4ecb-11e8-9c2d-fa7ae01bbebc
De fato, esses títulos "desconhecidos" não foram inventados pelos desenvolvedores. Normalmente, esses são artefatos do uso de determinadas estruturas de servidor, software ou serviços de fornecedores específicos (por exemplo, o último cabeçalho é típico da AWS).
O cabeçalho
X-Cache
adiciona Fastly (e outras CDNs), juntamente com outros cabeçalhos específicos, como
X-Cache-Hits
e
X-Served-By
. Quando a depuração está ativada, mais é adicionado, por exemplo,
Fastly-Debug-Path
e
Fastly-Debug-TTL
.
Esses cabeçalhos não são reconhecidos por nenhum navegador e sua remoção não afetará a exibição das páginas. Mas como eles podem fornecer informações úteis a você, o desenvolvedor, você pode salvá-las.
Incompreensão (Pragma)
Eu não esperava que em 2018 eu tivesse que mencionar o cabeçalho
Pragma
, mas de acordo com o HTTP Archive, ele ainda está no topo (11º lugar). Não foi apenas declarado obsoleto em 1997, mas nunca foi concebido como um cabeçalho de resposta, mas apenas como parte de uma solicitação.
Pragma: no-cache
No entanto, é tão amplamente usado como cabeçalho de resposta que alguns navegadores até o reconhecem nesse contexto. Hoje, porém, há quase zero chance de alguém entender a
Pragma
no contexto da resposta, mas não entender o
Cache-Control
. Se você deseja desativar o armazenamento em cache, tudo que você precisa é
Cache-Control: no-store, private
.
Não-navegadores (X-Robots-Tag)
Um cabeçalho no nosso top 30 não é um cabeçalho para o navegador.
X-Robots-Tag
desenvolvido para rastreadores, como o Google bots ou o Bing. Como é inútil para um navegador, você pode definir essa resposta apenas para solicitações de rastreadores. Ou você decide que isso dificulta o teste ou viola os termos de uso do mecanismo de pesquisa.
Bugs
Por fim, vale a pena terminar com uma menção honrosa de erros simples. O cabeçalho
Host
faz sentido na
solicitação , mas se aparecer na resposta, provavelmente o servidor não está configurado corretamente (e eu gostaria de saber como). No entanto, 68 domínios no arquivo HTTP retornam um cabeçalho de
Host
em suas respostas.
Removendo cabeçalhos em um servidor CDN de borda
Felizmente, se o site for executado rapidamente conosco, remover os cabeçalhos é bastante simples usando o
VCL . Se você deseja manter a equipe de desenvolvimento realmente útil para depuração, mas oculta-a ao público em geral, isso pode ser feito facilmente usando cookies ou o cabeçalho HTTP de entrada:
unset resp.http.Server;
unset resp.http.X-Powered-By;
unset resp.http.X-Generator;
if (!req.http.Cookie:debug && !req.http.Debug) {
unset resp.http.X-Amzn-RequestID;
unset resp.http.X-Cache;
}
No
próximo artigo , falarei sobre as práticas recomendadas para títulos realmente necessários e como ativá-las no servidor de borda da CDN.