Acerca de este problema HTML
El atributo http-equiv en el elemento <meta> está diseñado para simular ciertas cabeceras de respuesta HTTP directamente en HTML. Sin embargo, la especificación HTML solo permite un conjunto específico de valores: content-type, default-style, refresh, x-ua-compatible y content-security-policy. Usar Expires como valor para http-equiv provocará un error de validación porque está fuera de este conjunto permitido.
Históricamente, algunos navegadores más antiguos y versiones de HTML eran más permisivos sobre qué valores podían aparecer en http-equiv, y los desarrolladores comúnmente usaban <meta http-equiv="Expires" content="0"> o patrones similares para intentar prevenir el almacenamiento en caché de la página. Sin embargo, este enfoque nunca fue fiable — los navegadores y proxies de caché manejan las cabeceras HTTP reales de manera mucho más consistente que los equivalentes de etiquetas <meta>. El HTML moderno prohíbe formalmente este valor.
Más allá del cumplimiento de estándares, hay razones prácticas para evitar este patrón. Muchos navegadores simplemente ignoran valores http-equiv no reconocidos, lo que significa que la etiqueta no hace nada útil. El comportamiento de caché se controla mejor a nivel HTTP, donde servidores, CDNs y proxies leen y respetan las cabeceras. Depender de una etiqueta <meta> para el almacenamiento en caché da una falsa sensación de control mientras abarrota tu marcado con código inválido.
Para solucionar este problema, elimina la etiqueta <meta http-equiv="Expires" ...> de tu HTML y configura la cabecera HTTP Expires o Cache-Control en tu servidor web.
Ejemplos
Incorrecto: Usar Expires en http-equiv
Esto provoca el error de validación:
<head>
<meta charset="UTF-8">
<meta http-equiv="Expires" content="0">
<meta http-equiv="Expires" content="Tue, 01 Jan 2025 00:00:00 GMT">
<title>My Page</title>
</head>
Correcto: Eliminar la etiqueta <meta> inválida
Simplemente elimina la etiqueta problemática. Solo usa valores http-equiv válidos:
<head>
<meta charset="UTF-8">
<title>My Page</title>
</head>
Correcto: Usos válidos de http-equiv
Para referencia, aquí hay ejemplos de valores http-equiv válidos:
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="30">
<meta http-equiv="content-security-policy" content="default-src 'self'">
<meta http-equiv="default-style" content="main-stylesheet">
<title>My Page</title>
</head>
Correcto: Establecer la expiración de caché a través de la configuración del servidor
La forma adecuada de controlar el almacenamiento en caché es a través de cabeceras de respuesta HTTP configuradas en tu servidor.
Apache (.htaccess o configuración del servidor):
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/html "access plus 1 day"
</IfModule>
O usando Cache-Control con mod_headers:
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Expires "0"
</IfModule>
Nginx:
location ~* \.html$ {
expires 1d;
add_header Cache-Control "public, no-transform";
}
Para prevenir completamente el almacenamiento en caché en Nginx:
location ~* \.html$ {
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
Si no tienes acceso a la configuración del servidor, muchos lenguajes del lado del servidor te permiten establecer cabeceras programáticamente. Por ejemplo, en PHP:
<?php
header("Expires: Tue, 01 Jan 2030 00:00:00 GMT");
header("Cache-Control: public, max-age=86400");
?>
Al manejar la expiración de caché a nivel del servidor, obtienes un comportamiento fiable a través de todos los navegadores, proxies y CDNs — mientras mantienes tu HTML limpio y compatible con estándares.
Encuentra problemas como este automáticamente
Rocket Validator escanea miles de páginas en segundos, detectando problemas de HTML en todo tu sitio web.