Encabezados HTTP: actualización completa de JavaScript/CSS

Recientemente agregué encabezados HTTP a mi sitio para informar al navegador que verifique con el servidor cada vez que se encuentre con una URL JS/CSS determinada. Lo he probado y funciona perfectamente; todos los navegadores ahora hacen condicional GET peticiones.

Sin embargo, aquí está el problema: la gente todavía tiene los encabezados antiguos almacenados en caché; encabezados que más o menos le decían al navegador "almacena esto para siempre; ¡no te molestes en pedir una actualización!". Esto se puede romper con una actualización dura. No quiero tener que comunicarme con todos para que presionen F5 en cualquier página con errores después de que publiquemos el código.

¿Hay algún encabezado HTTP/etiqueta meta HTML que pueda poner en el documento HTML para decir "Navegador, ignore los encabezados que tiene en los archivos JS/CSS y descargue la última versión de todos los archivos incluidos en esta página"?

Eventualmente, este problema se resolverá a medida que más y más personas borren su caché o aprendan a actualizar por su cuenta. Pero, prefiero arreglarlo ahora. Luego, en aproximadamente un mes, eliminaré los encabezados de nivel HTML para obtener el almacenamiento en caché donde quiero, por recurso.

EDIT: No quiero cambiar el nombre de los recursos ni agregar parámetros de consulta. Eso es lo que solíamos usar (?v=18, ?v=19, etc.) y era una tarea ardua incrementar ese número cada vez que actualizábamos los recursos. Incluso hacerlo mediante programación no es la solución ideal; especialmente ahora que nuestro servidor está configurado correctamente. Tiene más sentido hacerlo en el nivel HTTP para que funcione independientemente de cómo acceda a él: incluido en una página, directamente desde la barra de direcciones o de otra manera.

preguntado el 12 de junio de 12 a las 20:06

¿Quizás cambiar el nombre de las hojas de estilo, luego cambiar el HTML para cargar una hoja diferente? -

2 Respuestas

pase un parámetro a la fuente del script que forzará una recarga del script... de hecho, podría hacerlo por versión o similar

<script src="/test/script/myawesomescript.js?ver=1.0&pwn=yes" ...>

eso funcionaría y no parecería para los otros usuarios... cuando sientas que ha pasado suficiente tiempo, vuelve a la forma anterior. pero esto funcionará si desea forzar una actualización de los usuarios.

Este método se utiliza para evitar el almacenamiento en caché de páginas web por parte de algunos marcos. Déjame saber si tuviste éxito

http://css-tricks.com/can-we-prevent-css-caching/ -- aquí hay un enlace al concepto para css (también debería funcionar en js) -- la mayor diferencia es que no quieres que nunca se almacene en caché, así que no uses una marca de tiempo, usa mi estilo como el de arriba :) ¡disfrútalo!

Respondido el 12 de junio de 12 a las 20:06

Básicamente, la única forma es hacer que el navegador no use la URL almacenada en caché.

Un método consiste en utilizar un parámetro ficticio de prevención de caché al final de la URL.

some-name.css?q=1

Eso forzará al navegador a recargar ese archivo (porque esa URL no está en el caché), y el archivo descargado no se almacenará en caché debido a sus nuevos encabezados. Sin embargo: es posible que deba usar este nuevo nombre indefinidamente, porque no puede garantizar que una vez que deje el parámetro ficticio nuevamente, la versión almacenada en caché aún se pueda usar.

El otro método es cambiar completamente el nombre del archivo.

my-new-name.css

Respondido el 12 de junio de 12 a las 20:06

vale la pena mencionar que puede mantener los encabezados de caché "para siempre" y simplemente seguir versionando los nombres de archivo de esta manera cuando se necesita un cambio. - cabra

@rambocoder: Sí, debería haberlo mencionado. Es la razón por la que el control de versiones se realiza a menudo de esta manera (las nuevas versiones se pueden especificar y se cargarán; las versiones antiguas aún se pueden especificar si es necesario). - Andrew Leach

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.