{"id":20021,"date":"2026-06-15T08:34:43","date_gmt":"2026-06-15T06:34:43","guid":{"rendered":"https:\/\/webhosting.de\/http-conditional-caching-etag-last-modified-performance-guide\/"},"modified":"2026-06-15T08:34:43","modified_gmt":"2026-06-15T06:34:43","slug":"guia-de-rendimiento-sobre-el-almacenamiento-en-cache-condicional-etag-y-la-fecha-de-ultima-modificacion-en-http","status":"publish","type":"post","link":"https:\/\/webhosting.de\/es\/http-conditional-caching-etag-last-modified-performance-guide\/","title":{"rendered":"Comprender el almacenamiento en cach\u00e9 condicional HTTP con ETag y Last-Modified"},"content":{"rendered":"<p>El almacenamiento en cach\u00e9 HTTP ahorra tiempo y datos, ya que solo vuelve a cargar los recursos cuando realmente han cambiado. A trav\u00e9s de <strong>ETag<\/strong> y <strong>\u00daltima modificaci\u00f3n<\/strong> Compruebo mediante una solicitud condicional si el servidor responde con un 304 Not Modified, lo que reduce considerablemente la transferencia de datos y la carga del servidor.<\/p>\n\n<h2>Puntos centrales<\/h2>\n\n<p>Las siguientes ideas clave muestran en qu\u00e9 me centro al utilizar el almacenamiento en cach\u00e9 condicional con <strong>ETag<\/strong> y <strong>\u00daltima modificaci\u00f3n<\/strong> atenci\u00f3n.<\/p>\n<ul>\n  <li><strong>Menos tr\u00e1fico<\/strong>: Los archivos sin cambios devuelven un c\u00f3digo de estado 304, en lugar de todo el cuerpo de la respuesta, lo que reduce notablemente el volumen de datos y la latencia.<\/li>\n  <li><strong>Mejor rendimiento<\/strong>: La reducci\u00f3n de los tiempos de espera mejora la experiencia del usuario (UX) y los Core Web Vitals, lo que <strong>SEO<\/strong> ayuda.<\/li>\n  <li><strong>Dos mecanismos<\/strong>: Last-Modified\/If-Modified-Since y ETag\/If-None-Match validan la cach\u00e9 de forma segura.<\/li>\n  <li><strong>Control de la cach\u00e9<\/strong>: Las directivas controlan la vigencia, la actualizaci\u00f3n y el comportamiento en las cach\u00e9s intermedias.<\/li>\n  <li><strong>Combinaci\u00f3n<\/strong>: Ambos m\u00e9todos, combinados, ofrecen una gran precisi\u00f3n y soluciones alternativas sencillas.<\/li>\n<\/ul>\n<p>Primero compruebo qu\u00e9 recursos cambian con mucha frecuencia y cu\u00e1les lo hacen raramente. Para los archivos que se modifican raramente, establezco un <strong>\u00daltima modificaci\u00f3n<\/strong>-Fecha y hora, y a\u00f1ado un ETag. Para las respuestas din\u00e1micas, prefiero utilizar el <strong>ETag<\/strong>, ya que cualquier cambio en el contenido se detecta de inmediato. De este modo, aligero la carga de los servidores, reduzco los tiempos de espera y ofrezco p\u00e1ginas muy r\u00e1pidas a los visitantes habituales. Esta estrategia refuerza la <strong>Core Web Vitals<\/strong> y, por lo tanto, indirectamente, la visibilidad.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/conditional-caching-8923.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Almacenamiento en cach\u00e9 condicional HTTP: c\u00f3mo comprobar la validez<\/h2>\n\n<p>Al realizar una nueva solicitud, el cliente env\u00eda, adem\u00e1s de GET, encabezados adicionales que eval\u00fao en el servidor. Si el recurso tiene el mismo <strong>ETag<\/strong> Si coincide con el cach\u00e9 (If-None-Match), devuelvo un 304 Not Modified sin cuerpo. Si la marca de tiempo no ha cambiado (If-Modified-Since), el servidor tambi\u00e9n responde con un 304. Si la fecha o el d\u00eda ya no coinciden, env\u00edo un 200 OK con contenido nuevo y actualizado. <strong>\u00daltima modificaci\u00f3n<\/strong> y ETag. De este modo, ahorro ancho de banda, mantengo la cach\u00e9 actualizada y consigo que los tiempos de carga sean notablemente m\u00e1s r\u00e1pidos.<\/p>\n\n<h2>\u00abLast-Modified\u00bb e \u00abIf-Modified-Since\u00bb en el d\u00eda a d\u00eda<\/h2>\n\n<p>El encabezado <strong>\u00daltima modificaci\u00f3n<\/strong> Utilizo la fecha y hora reales de modificaci\u00f3n del archivo, por ejemplo, las del sistema de archivos. Si m\u00e1s tarde llega una solicitud con \u00abIf-Modified-Since\u00bb y el recurso no ha cambiado desde entonces, respondo con un 304. Este m\u00e9todo es sencillo, f\u00e1cil de entender e ideal para recursos est\u00e1ticos como CSS, JS o im\u00e1genes. Las limitaciones surgen con la resoluci\u00f3n de segundos de las marcas de tiempo HTTP y en situaciones en las que el contenido cambia l\u00f3gicamente sin que exista una fecha de archivo clara. Donde Last-Modified llega a sus l\u00edmites, un <strong>ETag<\/strong> el control.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/meeting_http_caching_4573.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>ETag e If-None-Match en sistemas din\u00e1micos<\/h2>\n\n<p>A <strong>ETag<\/strong> Lo genero como un hash, un identificador de versi\u00f3n o a partir de una columna de la base de datos que marca los cambios de estado. Al volver a acceder, el navegador env\u00eda un If-None-Match; yo comparo la etiqueta con mi valor actual y respondo en consecuencia con un 304 o un 200. Esta comparaci\u00f3n detecta cualquier cambio significativo en el contenido sin depender de las marcas de tiempo de los archivos. Esto ofrece resultados muy precisos, especialmente en el caso de las API, las p\u00e1ginas compuestas o los fragmentos personalizados. Es importante mantener la coherencia de los ETags en entornos de cl\u00fasteres, para que ning\u00fan servidor utilice por error un <strong>D\u00eda<\/strong> producido.<\/p>\n\n<h2>Combinar correctamente el encabezado Cache-Control<\/h2>\n\n<p>Con <strong>Control de la cach\u00e9<\/strong> Defino durante cu\u00e1nto tiempo se considera que el contenido est\u00e1 actualizado sin necesidad de volver a consultarlo y cu\u00e1ndo el navegador debe volver a validarlo. Establezco valores adecuados para \u00abmax-age\u00bb en funci\u00f3n de la frecuencia de los cambios y utilizo \u00abmust-revalidate\u00bb cuando los datos obsoletos podr\u00edan ser cr\u00edticos. Para los archivos versionados, es adecuado un periodo de validez largo, mientras que las respuestas que cambian con frecuencia tienen una vida \u00fatil m\u00e1s corta y pueden verificarse correctamente mediante ETag o la fecha. De este modo, combino tiempos de respuesta cortos con una actualidad correcta. Quien desee profundizar en el tema, encontrar\u00e1 muchos ejemplos en <a href=\"https:\/\/webhosting.de\/es\/estrategias-de-control-de-cache-http-alojamiento-cachemaster\/\">Estrategias de control de cach\u00e9<\/a>, que utilizo en la consulta.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/http-caching-etag-concept-3892.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Proceso paso a paso de una solicitud GET condicional<\/h2>\n\n<p>En la primera solicitud, el servidor env\u00eda un 200 OK con Cache-Control, <strong>\u00daltima modificaci\u00f3n<\/strong> y el ETag; el navegador lo guarda todo. En la siguiente visita, la antig\u00fcedad en la cach\u00e9 determina si es necesaria una revalidaci\u00f3n. Si es necesario, el navegador realiza la solicitud con If-None-Match y\/o If-Modified-Since. Si los valores coinciden con el estado actual, env\u00edo un 304 Not Modified y el cliente sigue utilizando su cach\u00e9. Si ya no coinciden, se env\u00eda un 200 OK con un nuevo cuerpo y datos actualizados. <strong>Datos de validaci\u00f3n<\/strong>.<\/p>\n\n<h2>Comparaci\u00f3n: ETag frente a Last-Modified<\/h2>\n\n<p>Ambos m\u00e9todos me garantizan el control, pero difieren en cuanto a esfuerzo, precisi\u00f3n e idoneidad. <strong>\u00daltima modificaci\u00f3n<\/strong> Destaca por su f\u00e1cil implementaci\u00f3n y su sem\u00e1ntica clara, siempre y cuando disponga de marcas de tiempo precisas. El ETag refleja el contenido con gran precisi\u00f3n, pero requiere algo de l\u00f3gica para generarlo. En muchas configuraciones combino ambos y as\u00ed me beneficio de la simplicidad y del reconocimiento exacto. La siguiente tabla resume las caracter\u00edsticas t\u00edpicas y ayuda a tomar una decisi\u00f3n.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th><strong>Aspecto<\/strong><\/th>\n      <th><strong>\u00daltima modificaci\u00f3n<\/strong><\/th>\n      <th><strong>ETag<\/strong><\/th>\n      <th><strong>Nota<\/strong><\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>Identidad<\/td>\n      <td>Fecha y hora de la \u00faltima modificaci\u00f3n<\/td>\n      <td>Hash del contenido o ID de versi\u00f3n<\/td>\n      <td><strong>Tiempo<\/strong> frente a un identificador basado en el contenido<\/td>\n    <\/tr>\n    <tr>\n      <td>Detecci\u00f3n de cambios<\/td>\n      <td>Resoluci\u00f3n de segundos, indirecta<\/td>\n      <td>Orientado directamente al contenido<\/td>\n      <td>ETag detecta las part\u00edculas m\u00e1s peque\u00f1as <strong>Diferencias<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>implementaci\u00f3n<\/td>\n      <td>Muy ligero, el sistema de archivos es suficiente<\/td>\n      <td>Requiere generaci\u00f3n y coherencia<\/td>\n      <td>Los cl\u00fasteres necesitan lo mismo <strong>ETags<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>Utilice<\/td>\n      <td>Recursos est\u00e1ticos<\/td>\n      <td>Respuestas din\u00e1micas<\/td>\n      <td>Esta combinaci\u00f3n cubre muchas <strong>Casos<\/strong> de<\/td>\n    <\/tr>\n    <tr>\n      <td>Respuestas<\/td>\n      <td>304 sin cambios en la marca de tiempo<\/td>\n      <td>304 con la misma etiqueta<\/td>\n      <td>200 en caso de modificaciones con un nuevo <strong>Valor<\/strong><\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/tech_office_caching_4721.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Pr\u00e1ctica: Distribuci\u00f3n eficiente de recursos est\u00e1ticos<\/h2>\n\n<p>Los archivos est\u00e1ticos, como CSS, JS e im\u00e1genes, rara vez cambian y son adecuados para periodos largos <strong>max-age<\/strong>-Tiempos. Para los archivos versionados, establezco valores altos, de hasta un a\u00f1o, y los marco como inmutables, para que el navegador los cargue sin solicitar confirmaci\u00f3n. Para los activos sin versionar, elijo plazos m\u00e1s cortos y conf\u00edo en la revalidaci\u00f3n mediante ETag y Last-Modified. As\u00ed evito contenidos obsoletos y mantengo el tr\u00e1fico bajo. Me aseguro de no <a href=\"https:\/\/webhosting.de\/es\/http-cache-headers-sabotear-el-almacenamiento-en-cache-cachefix\/\">Sabotear la cabecera de la cach\u00e9<\/a> si lo dejo as\u00ed, consigo una alta tasa de aciertos en la cach\u00e9.<\/p>\n\n<h2>Aplicaci\u00f3n pr\u00e1ctica: API y p\u00e1ginas din\u00e1micas<\/h2>\n\n<p>En cuanto a las API, suelo optar por <strong>ETags<\/strong>, que genero a partir del resultado serializado o de una columna de versi\u00f3n. Si el registro cambia, genero una nueva etiqueta, y los clientes lo detectan de inmediato. Para contenidos con marcas de tiempo poco fiables, a menudo prescindo de Last-Modified, para que no se cree una falsa impresi\u00f3n de actualidad. Adem\u00e1s, controlo la vida \u00fatil mediante Cache-Control y, una vez caducada, obligo a la revalidaci\u00f3n. De este modo, mantengo los datos actualizados de forma fiable, sin que las respuestas sean innecesariamente grandes.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/developer_desk_caching_3947.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Pruebas y supervisi\u00f3n de la tasa de aciertos de la cach\u00e9<\/h2>\n\n<p>Compruebo encabezados como <strong>ETag<\/strong>, Last-Modified, If-None-Match e If-Modified-Since en las herramientas de desarrollo. Al hacerlo, presto atenci\u00f3n a los c\u00f3digos de respuesta, especialmente al 304 frente al 200, para comprobar la eficacia de mi revalidaci\u00f3n. Si el 304 es poco frecuente, ajusto el Cache-Control, los tiempos de caducidad y la generaci\u00f3n de ETag. Los registros y las m\u00e9tricas me muestran qu\u00e9 rutas devuelven respuestas innecesariamente grandes. Para mejoras agrupadas, me gusta utilizar un <a href=\"https:\/\/webhosting.de\/es\/paquete-de-optimizacion-de-la-validacion-de-la-cache-de-peticiones-condicionales-http\/\">Paquete de solicitudes condicionales<\/a>, que combina la configuraci\u00f3n y las pruebas.<\/p>\n\n<h2>Arquitectura de alojamiento y trampas ETag<\/h2>\n\n<p>En configuraciones con varios servidores, es necesario un <strong>ETag<\/strong> Debe ser independiente de la instancia; de lo contrario, el reconocimiento fallar\u00e1. Me aseguro de que todos los nodos utilicen la misma l\u00f3gica y la misma clave para la generaci\u00f3n. Los proxies inversos o las CDN no deben modificar los ETag y deben reenviar correctamente los encabezados de condici\u00f3n. En implementaciones con huellas de activos, evito el rec\u00e1lculo de ETags por parte del servidor si el archivo ya lleva una URL versionada. Unas reglas uniformes evitan respuestas inconsistentes y mantienen alta la tasa de aciertos de la cach\u00e9.<\/p>\n\n<h2>Actualizaci\u00f3n frente a validaci\u00f3n: uso preciso de las directivas<\/h2>\n\n<p>Hago una clara distinci\u00f3n entre <em>Frescura<\/em> (\u00bfDurante cu\u00e1nto tiempo puede un cach\u00e9 utilizar una copia sin consultar el servidor?) y <em>Validaci\u00f3n<\/em> (\u00bfc\u00f3mo compruebo si sigue siendo v\u00e1lida?). A trav\u00e9s de <strong>Control de la cach\u00e9<\/strong> puedo controlar ambos con gran precisi\u00f3n: <strong>max-age<\/strong> establece el tiempo de vida en el cliente, <strong>s-maxage<\/strong> para cach\u00e9s compartidas, como los proxies. <strong>p\u00fablico<\/strong> permite el almacenamiento en cach\u00e9 en cach\u00e9s compartidas, <strong>privado<\/strong> lo limita al navegador final. <strong>debe revalidarse<\/strong> obliga a realizar consultas tras la expiraci\u00f3n, mientras que <strong>inmutable<\/strong> evita revalidaciones innecesarias en el caso de los activos versionados. <strong>no-cache<\/strong> no proh\u00edbe el almacenamiento en cach\u00e9, sino que exige una revalidaci\u00f3n en todo momento; <strong>no-store<\/strong> por el contrario, proh\u00edbe totalmente el almacenamiento. Las versiones anteriores <strong>Expira en<\/strong>Utilizo el encabezado -Header solo como alternativa; traspaso sistem\u00e1ticamente la l\u00f3gica a Cache-Control. Y si quiero mitigar los fallos, me ayudan <strong>stale-while-revalidate<\/strong> y <strong>stale-if-error<\/strong>, para seguir compartiendo contenidos que han caducado recientemente, mientras actualizo en segundo plano o soluciono los errores.<\/p>\n\n<h2>ETags fuertes y d\u00e9biles, compresi\u00f3n y variantes<\/h2>\n\n<p>Distingo deliberadamente entre los factores de validaci\u00f3n fuertes y los d\u00e9biles. <strong>ETags fuertes<\/strong> identifican exactamente la misma representaci\u00f3n, byte a byte; ideal si yo tambi\u00e9n <strong>Solicitudes de gama<\/strong> quiere gestionar de forma eficiente. <strong>ETags d\u00e9biles<\/strong> (Prefijo <code>W\/<\/code>) basta con que haya equivalencia sem\u00e1ntica, por ejemplo, en el caso de peque\u00f1os cambios de formato sin importancia. Lo importante es c\u00f3mo se gestiona <strong>Compresi\u00f3n<\/strong>: Si sirvo contenidos codificados tanto con gzip como con Brotli, no se puede utilizar un \u00fanico ETag para todas las variantes. O bien genero el ETag a partir de la versi\u00f3n sin comprimir y, adem\u00e1s, establezco un <strong>Vary: Accept-Encoding<\/strong>, o bien genero ETags coherentes pero diferentes para cada variante. De este modo evito resultados err\u00f3neos y respuestas 200 que en realidad deber\u00edan ser 304. En <strong>If-Range<\/strong> Combino las consultas de alcance con un validador: si el ETag o la fecha coinciden, respondo con un 206 (contenido parcial); en caso contrario, devuelvo un 200 con el cuerpo completo, para que el cliente disponga de una base coherente.<\/p>\n\n<h2>Dominar a la perfecci\u00f3n los encabezados Vary y la negociaci\u00f3n de contenido<\/h2>\n\n<p>Siempre que el servidor proporcione diferentes representaciones en funci\u00f3n de los requisitos, yo <strong>Variar<\/strong> correcto. Algunos ejemplos t\u00edpicos son <strong>Aceptaci\u00f3n de codificaci\u00f3n<\/strong> (compresi\u00f3n), <strong>Aceptar idioma<\/strong> (localizaci\u00f3n) o indicadores de funciones espec\u00edficos. Evito recurrir a encabezados vol\u00e1tiles como <strong>Agente de usuario<\/strong> o incluso <strong>Galleta<\/strong> variar, porque eso reduce dr\u00e1sticamente la tasa de aciertos de la cach\u00e9. Cuando es necesaria la personalizaci\u00f3n, marco las respuestas como <strong>privado<\/strong> o <strong>no-store<\/strong> y las separo claramente de los recursos que se pueden almacenar en cach\u00e9 p\u00fablicamente. Importante: las variaciones tambi\u00e9n afectan a los ETags; cada variante necesita su propio validador coherente. De este modo, me aseguro de que los navegadores, los proxies y las CDN apliquen la misma l\u00f3gica y de que ninguna variante se mezcle accidentalmente con otra.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/httpcaching-verstehen-2638.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Consultas condicionales m\u00e1s all\u00e1 de GET<\/h2>\n\n<p>Las solicitudes condicionales no solo funcionan en la lectura. Para los m\u00e9todos de escritura, utilizo <strong>Si coincide<\/strong> o <strong>If-Unmodified-Since<\/strong>con el fin de <em>actualizaciones perdidas<\/em> para evitarlo. Si el cliente env\u00eda el ETag visto por \u00faltima vez en una operaci\u00f3n PUT o DELETE mediante <strong>Si coincide<\/strong> si el estado del servidor sigue siendo el mismo, solo aplico el cambio; de lo contrario, respondo con <strong>412 Condici\u00f3n previa no cumplida<\/strong>. Para controlar a los clientes, el servidor tambi\u00e9n puede <strong>428 Se requiere una condici\u00f3n previa<\/strong> establecer. Para pruebas r\u00e1pidas sin cuerpo, utilizo <strong>HEAD<\/strong>, que me devuelve los mismos encabezados que una solicitud GET; ideal si quiero probar los metadatos. Y en <strong>304<\/strong>-En las respuestas vuelvo a incluir todos los encabezados relevantes para la cach\u00e9 (Cache-Control, ETag, Expires, Last-Modified), para que el cliente actualice sus metadatos sin necesidad de transferir el cuerpo del mensaje.<\/p>\n\n<h2>Seguridad, protecci\u00f3n de datos y cumplimiento de la normativa<\/h2>\n\n<p>No guardo contenidos personales o sensibles en la cach\u00e9 p\u00fablica. En este caso, utilizo <strong>Control de cach\u00e9: privado<\/strong> o <strong>no-store<\/strong>, para que el navegador, o m\u00e1s bien ninguna instancia, guarde el contenido. Hay que tener cuidado con las cuentas de usuario y los paneles de control: las respuestas con <strong>Establecer cookie<\/strong> o <strong>Autorizaci\u00f3n<\/strong> no deben poder almacenarse en cach\u00e9 de forma p\u00fablica por error. Los propios ETags pueden utilizarse indebidamente como vector de rastreo si se mantienen estables durante mucho tiempo. Para evitarlo, utilizo los validadores solo donde el almacenamiento en cach\u00e9 es deseado, y los desactivo en rutas espec\u00edficas para el usuario o mantengo su vida \u00fatil corta. De esta forma, combino el rendimiento con los requisitos de protecci\u00f3n de datos.<\/p>\n\n<h2>Detalles de implementaci\u00f3n y costes de rendimiento<\/h2>\n\n<p>La generaci\u00f3n de una etiqueta ETag no debe ser m\u00e1s costosa que el beneficio que aporta. En el caso de archivos grandes o renderizados costosos, guardo la etiqueta junto con los metadatos (suma de comprobaci\u00f3n del archivo, hash de compilaci\u00f3n, base de datos-<em>versi\u00f3n de fila<\/em>) y no lo recapitulo en cada solicitud. En el caso de las p\u00e1ginas compuestas, resulta \u00fatil una <em>Estrategia de creaci\u00f3n de versiones<\/em>: Creo el ETag a partir de sub-ETags estables (por ejemplo, plantilla, fragmento de datos, configuraci\u00f3n), de modo que los peque\u00f1os cambios den como resultado un nuevo valor espec\u00edfico pero reproducible. En cl\u00fasteres, sincronizo la l\u00f3gica de generaci\u00f3n en una biblioteca com\u00fan y la compruebo en CI para que ninguna instancia se desv\u00ede. Para blobs extremadamente grandes, utilizo sumas de comprobaci\u00f3n r\u00e1pidas (CRC64) o guardo hash de compilaci\u00f3n, en lugar de generar el hash del cuerpo sobre la marcha. Cuando no es necesaria la igualdad absoluta de bytes, basta con <strong>ETags d\u00e9biles<\/strong> como un compromiso pragm\u00e1tico.<\/p>\n\n<h2>Errores comunes y c\u00f3mo evitarlos<\/h2>\n\n<ul>\n  <li><strong>ETags aleatorios<\/strong>: Si las etiquetas se generan de nuevo en cada solicitud, cualquier revalidaci\u00f3n carece de sentido. Me aseguro de que los valores sean deterministas y solo cambien cuando se produzca un cambio real.<\/li>\n  <li><strong>Combinaci\u00f3n incorrecta de directivas<\/strong>: <em>no-store<\/em> Usar ETag no sirve de nada: el navegador no lo almacena de todos modos. Elijo combinaciones coherentes para conseguir el comportamiento deseado.<\/li>\n  <li><strong>Vary excesivo<\/strong>: Las variaciones en las cookies o en el User-Agent desorganizan la cach\u00e9. Limito el campo \u00abVary\u00bb a cambios reales en la representaci\u00f3n.<\/li>\n  <li><strong>Trampas de compresi\u00f3n<\/strong>: Un ETag com\u00fan para gzip y br provoca resultados err\u00f3neos. Asigno los ETags correctamente a la variante concreta y configuro Vary de forma adecuada.<\/li>\n  <li><strong>Desviaci\u00f3n horaria<\/strong>: Los relojes de servidor inexactos distorsionan el valor de \u00abLast-Modified\u00bb. Mantengo sincronizadas las fuentes de tiempo para que \u00abIf-Modified-Since\u00bb funcione correctamente.<\/li>\n  <li><strong>Confusi\u00f3n con \u00abno-cache\u00bb<\/strong>: Muchos leen \u201eno almacenar en cach\u00e9\u201c. Lo que se quiere decir es \u201erevalidar siempre\u201c. Para una prohibici\u00f3n real, yo utilizo <em>no-store<\/em>.<\/li>\n<\/ul>\n\n<h2>Resoluci\u00f3n de problemas, m\u00e9tricas y flujos de trabajo<\/h2>\n\n<p>Para solucionar el problema, empiezo por la pesta\u00f1a \u00abRed\u00bb: \u00bfEs correcto? <strong>Control de la cach\u00e9<\/strong>? \u00bfSe aplica en caso de rehabilitaci\u00f3n? <strong>304<\/strong> \u00bfEn lugar de 200? \u00bfTe vale? <strong>ETag<\/strong> y <strong>\u00daltima modificaci\u00f3n<\/strong> \u00bfCu\u00e1nto tiempo pasa entre la consulta y la respuesta? Lo voy a comprobar <strong>Variar<\/strong>, para comprobar si las variantes se han detectado correctamente. En los registros, me muestro <em>Acierto\/Error<\/em>-Mostrar las tasas de 304 y el tama\u00f1o medio de las respuestas por ruta. Si la tasa de 304 aumenta, el volumen de datos y el TTFB suelen disminuir de forma notable. En las pruebas de carga, simulo llamadas repetidas para medir los costes de revalidaci\u00f3n en lugar de los de transferencia. Si detecto anomal\u00edas, elimino gradualmente los factores perturbadores: Set-Cookie, reglas Vary demasiado estrictas, encabezados contradictorios como Pragma. As\u00ed encuentro r\u00e1pidamente el cuello de botella que reduce la tasa de visitas.<\/p>\n\n<h2>Los Service Workers como capa de cach\u00e9 complementaria<\/h2>\n\n<p>Si utilizo un Service Worker, lo utilizo como un nivel adicional, no como uno contradictorio. Dejo que se encargue de lo mismo <strong>Control de la cach\u00e9<\/strong>-Respeta las se\u00f1ales y combina estrategias como <em>stale-while-revalidate<\/em> utilizando deliberadamente la validaci\u00f3n HTTP mediante ETag y Last-Modified. En casos de conexi\u00f3n offline, el worker puede proporcionar recursos que hayan quedado obsoletos temporalmente y revalidarlos en segundo plano. Es importante que transmita correctamente los encabezados de condici\u00f3n; de lo contrario, pierdo las ventajas del 304 en la conexi\u00f3n de red. De este modo, los escenarios de PWA tambi\u00e9n se benefician de un almacenamiento en cach\u00e9 HTTP limpio, en lugar de eludir sus mecanismos.<\/p>\n\n<h2>Efecto SEO y Core Web Vitals<\/h2>\n\n<p>Mejorar las respuestas r\u00e1pidas <strong>UX<\/strong> y las se\u00f1ales de los usuarios, lo que favorece el posicionamiento. Los visitantes habituales son los que m\u00e1s se benefician, ya que su navegador recupera muchos archivos directamente de la cach\u00e9 o mediante un c\u00f3digo de estado 304. Esta menor latencia tiene un efecto positivo en el FCP, el LCP y el TTFB, que reduzco mediante una revalidaci\u00f3n selectiva. Adem\u00e1s, el servidor ahorra tiempo de procesamiento, que puedo utilizar para picos de carga o solicitudes complejas. De este modo, mantengo el rendimiento, mientras que los contenidos llegan correctamente y de forma oportuna.<\/p>\n\n<h2>Resumen: Mi plan de acci\u00f3n<\/h2>\n\n<p>Conf\u00edo en una clara <strong>Combinaci\u00f3n<\/strong> a partir de Cache-Control, Last-Modified y ETag. Para los recursos est\u00e1ticos, elijo duraciones largas y me aseguro mediante la revalidaci\u00f3n cuando los archivos no est\u00e1n versionados. Para las respuestas din\u00e1micas, genero ETags fiables y mantengo la coherencia de los cl\u00fasteres. A continuaci\u00f3n, compruebo con herramientas, m\u00e9tricas y registros si los 304 se producen con la frecuencia suficiente y ajusto la configuraci\u00f3n. De este modo, garantizo una entrega r\u00e1pida, una menor carga y una mejor experiencia de usuario mediante un <strong>Almacenamiento en cach\u00e9 HTTP<\/strong>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Descubre c\u00f3mo funciona el almacenamiento en cach\u00e9 condicional HTTP con ETag y Last-Modified, c\u00f3mo se implementa la validaci\u00f3n de la cach\u00e9 del navegador y c\u00f3mo puedes optimizar los tiempos de carga, el ancho de banda y la carga del servidor.<\/p>","protected":false},"author":1,"featured_media":20014,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[834],"tags":[],"class_list":["post-20021","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-plesk-webserver-plesk-administration-anleitungen"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"129","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"HTTP Caching","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"20014","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/es\/wp-json\/wp\/v2\/posts\/20021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/es\/wp-json\/wp\/v2\/comments?post=20021"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/es\/wp-json\/wp\/v2\/posts\/20021\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/es\/wp-json\/wp\/v2\/media\/20014"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/es\/wp-json\/wp\/v2\/media?parent=20021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/es\/wp-json\/wp\/v2\/categories?post=20021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/es\/wp-json\/wp\/v2\/tags?post=20021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}