Los encabezados HTTP son importantes para controlar cómo la caché y los navegadores procesan su contenido. Pero muchos de ellos se usan de manera incorrecta o sin sentido, gastando recursos adicionales en un momento crítico de carga de la página, y es posible que no funcionen como cree. En una serie de artículos sobre mejores prácticas, primero veremos títulos innecesarios.
La mayoría de los desarrolladores conocen los encabezados HTTP importantes y útiles. Los más famosos son
Content-Type
y
Content-Length
, estos son encabezados casi universales. Pero recientemente, se han utilizado encabezados como
Content-Security-Policy
y
Strict-Transport-Security
para aumentar la
Strict-Transport-Security
, y
Link rel=preload
para mejorar el rendimiento. A pesar del soporte generalizado en los navegadores, solo unos pocos los usan.
Al mismo tiempo, hay muchos titulares extremadamente populares que generalmente no son nuevos ni muy útiles. Podemos probar esto con la ayuda de
HTTP Archive , un proyecto ejecutado por Google y patrocinado por Fastly, que descarga 500,000 sitios cada mes usando
WebPageTest y sube los resultados a
BigQuery .
Aquí están los 30 encabezados de respuesta más populares según el Archivo HTTP (según el número de dominios en el archivo que muestra cada encabezado) y una estimación aproximada de la utilidad de cada uno de ellos:
Titular | Consultas | Dominios | Estado |
---|
fecha | 48779277 | 535621 | Protocolo requerido |
tipo de contenido | 47185627 | 533636 | Generalmente requerido por el navegador |
servidor | 43057807 | 519663 | Opcional |
longitud de contenido | 42388435 | 519118 | Útil |
última modificación | 34424562 | 480294 | Útil |
control de caché | 36490878 | 412943 | Útil |
etag | 23620444 | 412370 | Útil |
codificación de contenido | 16194121 | 409159 | Requerido para contenido comprimido |
expira | 29869228 | 360311 | Opcional |
x-powered-by | 4883204 | 211409 | Opcional |
pragma | 7641647 | 188784 | Opcional |
x-frame-options | 3670032 | 105846 | Opcional |
control de acceso-permitir-origen | 11335681 | 103596 | Útil |
Opciones de tipo de contenido x | 11071560 | 94590 | Útil |
enlace | 1212329 | 87475 | Útil |
edad | 7401415 | 59242 | Útil |
x-cache | 5275343 | 56889 | Opcional |
protección x-xss | 9773906 | 51810 | Útil |
estricta seguridad de transporte | 4259121 | 51283 | Útil |
vía | 4020117 | 47102 | Opcional |
p3p | 8282840 | 44308 | Opcional |
esperar-ct | 2685280 | 40465 | Útil |
lenguaje de contenido | 334081 | 37927 | Controvertido |
x-aspnet-version | 676128 | 33473 | Opcional |
acceso-control-permitir-credenciales | 2804382 | 30346 | Útil |
x-robots-tag | 179177 | 24911 | No importa para los navegadores |
compatible con x-ua | 489056 | 24811 | Opcional |
acceso-control-permitir-métodos | 1626129 | 20791 | Útil |
control de acceso-permitir-encabezados | 1205735 | 19120 | Útil |
Veamos los encabezados opcionales, por qué no los necesitamos y qué hacer al respecto.
Vanity (servidor, x-powered-by, vía)
Puede estar muy orgulloso de su elección de software de servidor, pero a la mayoría de las personas no les importa. En el peor de los casos, estos encabezados pueden revelar datos confidenciales, lo que facilita el ataque a su sitio.
Server: apache
X-Powered-By: PHP/5.1.1
Via: 1.1 varnish, 1.1 squid
RFC7231 le permite incluir el encabezado del servidor en la respuesta del servidor, indicando el software específico en el servidor que se utiliza para entregar el contenido. Muy a menudo se trata de una cadena como "apache" o "nginx". Aunque el título está permitido, es opcional y no es particularmente valioso para los desarrolladores o usuarios finales. Sin embargo, hoy es el tercer encabezado de servidor HTTP más popular en Internet.
X-Powered-By
es el título más popular que no está definido por ningún estándar y tiene un propósito similar: generalmente indica la plataforma de aplicación en la que se ejecuta el servidor. Las respuestas más populares incluyen "ASP.net", "PHP" y "Express". Una vez más, esto no aporta ningún beneficio tangible y solo tiene lugar.
Quizás más controvertido pueda considerarse
Via
. Se requiere (de
acuerdo con RFC7230 ) agregar a la
solicitud cada proxy a través del cual pasa la solicitud, para identificar el proxy. Este puede ser el nombre de host proxy, pero con mayor frecuencia un identificador genérico como "vegur", "barniz" o "calamar". Eliminar (o no agregar) dicho encabezado puede conducir a un
ciclo de reenvío de proxy . Pero es interesante que también se agregue en respuesta a la ruta de retorno al navegador, y aquí simplemente realiza una función de información: ningún navegador hace nada con él, por lo que es lo suficientemente seguro como para deshacerse de él si lo desea.
Estándares obsoletos (P3P, caduca, opciones de marco X, compatible con X-UA)
Otra categoría de encabezados son los que realmente causan un efecto en el navegador, pero (ya) no son la mejor manera de lograr este efecto.
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
es una pequeña cosa divertida. No tenía idea de qué era. Aún más divertido, uno de los contenidos más comunes del encabezado P3P es "Esto no es una regla P3P". Bueno, eso es o no?
Aquí, la historia se remonta a
un intento de estandarizar las reglas de privacidad legibles por máquina . Hubo desacuerdo sobre cómo mostrar los datos en los navegadores, y solo un navegador implementó soporte para este encabezado: Internet Explorer. Pero incluso en él, P3P no tuvo ningún efecto visual para el usuario; solo tenía que estar presente para permitir el acceso a cookies de terceros en marcos. Algunos sitios incluso establecen reglas de incumplimiento P3P, como en el ejemplo anterior, aunque hacerlo es
muy cuestionable .
No hace falta decir que leer cookies de terceros generalmente es una mala idea, por lo que si no lo hace, ¡no necesita configurar el encabezado
P3P
!
Expires
simplemente increíblemente popular teniendo en cuenta que
Cache-Control
ha sido superior a
Expires
durante más de 20 años. Si el encabezado
Cache-Control
contiene la directiva
max-age
, se ignora cualquier encabezado
Expires
en la misma respuesta. Sin embargo, una gran cantidad de sitios configuran estos dos encabezados, y
Expires
mayor frecuencia la fecha
Thu, 01 Dec 1994 16: 00: 00 GMT
, para que el contenido no se almacene en caché. Por supuesto, es más fácil copiar la fecha
de las especificaciones .

Pero simplemente no hay necesidad de hacer esto. Si tiene un encabezado
Expires
con una fecha del pasado, simplemente reemplácelo con:
Cache-Control: no-store, private
(
no-store
es una directiva demasiado estricta para no escribir contenido en el almacenamiento persistente, por lo que puede preferir
no-cache
para un mejor rendimiento, por ejemplo, para navegar hacia atrás / adelante o reanudar pestañas dormidas en un navegador)
Algunas herramientas de validación del sitio le aconsejarán que agregue un encabezado
X-Frame-Options
con el valor 'SAMEORIGIN'. Le dice a los navegadores que se niega a enviar contenido a un marco en otro sitio: como regla, esta es una buena defensa contra el
clickjacking . Pero se puede lograr el mismo efecto con otro encabezado con un soporte más consistente y un comportamiento más confiable:
Content-Security-Policy: frame-ancestors 'self'
Aquí hay un beneficio adicional, porque todavía tiene que dar el encabezado CSP por otros motivos (más información sobre ellos más adelante). Probablemente, en nuestro tiempo, puede prescindir de
X-Frame-Options
.
Finalmente, en IE9, Microsoft introdujo un "modo de compatibilidad" que renderizó la página usando el motor IE8 o IE7. Incluso en modo normal, el navegador pensó que podría ser necesaria una versión anterior del motor para una representación adecuada. Estas heurísticas no siempre funcionaban correctamente, y los desarrolladores podían anularlas usando el encabezado o metaetiqueta
X-UA-Compatible
con
X-UA-Compatible
. De hecho, esto se ha convertido en una parte estándar de muchos marcos como Bootstrap. Ahora este encabezado es prácticamente inútil: la proporción de navegadores que lo entienden es muy pequeña. Y si apoya activamente el sitio, es muy poco probable que use tecnologías que inicien el modo de compatibilidad.
Datos de depuración (X-ASPNet-Version, X-Cache)
De alguna manera, es sorprendente que algunos de los títulos más populares no se mencionen en absoluto en ningún estándar. Esencialmente, esto significa que miles de sitios web de alguna manera acordaron usar un cierto encabezado de cierta manera.
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 hecho, estos títulos "desconocidos" no fueron inventados por los desarrolladores. Típicamente, estos son artefactos del uso de ciertos marcos de servidores, software o servicios de proveedores específicos (por ejemplo, el último encabezado es típico para AWS).
El encabezado
X-Cache
agrega Fastly (y otros CDN), junto con otros encabezados específicos como
X-Cache-Hits
y
X-Served-By
. Cuando la depuración está habilitada, se agrega más, por ejemplo,
Fastly-Debug-Path
y
Fastly-Debug-TTL
.
Estos encabezados no son reconocidos por ningún navegador, y su eliminación no afectará en absoluto la visualización de las páginas. Pero como pueden proporcionarle a usted, el desarrollador, información útil, puede guardarlos.
Malentendido (Pragma)
No esperaba que en 2018 tuviera que mencionar el encabezado
Pragma
, pero de acuerdo con el Archivo HTTP, todavía está en la parte superior (11 ° lugar). No solo se declaró obsoleto en 1997, sino que nunca se concibió como un encabezado de respuesta, sino solo como parte de una solicitud.
Pragma: no-cache
Sin embargo, se usa tanto como encabezado de respuesta que algunos navegadores incluso lo reconocen en este contexto. Pero hoy hay casi cero posibilidades de que alguien entienda a
Pragma
en el contexto de la respuesta, pero no entienda
Cache-Control
. Si desea deshabilitar el almacenamiento en caché, todo lo que necesita es
Cache-Control: no-store, private
.
No navegadores (X-Robots-Tag)
Un título en nuestro top 30 no es un título para el navegador.
X-Robots-Tag
diseñado para rastreadores como los robots de Google o Bing. Dado que es inútil para un navegador, puede configurar dicha respuesta solo para las solicitudes de los rastreadores. O decide que esto dificulta las pruebas o viola los términos de uso del motor de búsqueda.
Bichos
Finalmente, vale la pena terminar con una mención honorífica de errores simples. El encabezado
Host
tiene sentido en la
solicitud , pero si aparece en la respuesta, entonces su servidor probablemente no esté configurado correctamente (y me gustaría saber cómo). Sin embargo, 68 dominios en el Archivo HTTP devuelven un encabezado de
Host
en sus respuestas.
Eliminar encabezados en un servidor CDN perimetral
Afortunadamente, si su sitio se ejecuta rápidamente con nosotros, eliminar los encabezados es bastante simple con
VCL . Si desea mantener al equipo de desarrollo realmente útil para la depuración, pero ocultarlo al público en general, entonces esto se hace fácilmente usando cookies o el encabezado HTTP entrante:
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;
}
En el
próximo artículo hablaré sobre las mejores prácticas para los títulos realmente necesarios y cómo activarlos en el servidor de CDN Edge.