> Faqs > Solucionar cacheo del navegador en redirecciones

Solucionar cacheo del navegador en redirecciones

Tengo una ruta de mi aplicación que me redirecciona a otra URL después de hacer un proceso.

La redirección la hago con PHP, con un código como este:

header("HTTP/1.1 301 Moved Permanently");
header("Location: /index.php");

El caso es que, antes de realizar la redirección, desde PHP tengo que realizar un procesamiento que resulta importante para mi aplicación. En ese procesamiento guardo cosas en la base de datos, hago validaciones de ciertos datos, etc.

La primera vez que ejecuto el proceso me funciona todo bien. Se comienza a ejecutar, se validan los datos. Si no se validaron correctamente, entonces me muestra un mensaje de error, pero en el caso que se validan, entonces me hace la redirección.

Mi problema es que, una vez que se ha realizado la redirección, las siguientes veces que se accede a esa ruta no se realiza todo el procesamiento necesario. El navegador simplemente me lleva a la ruta de destino de la redirección, pero no me actualiza nada de lo que debería dentro de la base de datos.

Es como si el navegador estuviera cacheando la redirección. La primera vez, como no conoce la ruta, me realiza el proceso y me redirecciona correctamente. Pero la segunda vez que intento acceder a esa ruta, simplemente me redirecciona. Es decir, la caché del navegador manda y no me hace el proceso necesario.

¿Aguna sugerencia para evitar la caché del navegador en las redirecciones? (Si es que mi problema es la caché, que imagino que sí)

Respuestas

La situación que describes es justamente la que debería de producirse ante una redirección 301. Es decir, el navegador está trabajando según lo esperado.

Ten en cuenta que el código 301 indica una redirección permanente. Por ello, el navegador hace bien en cachearla, dado que esa URL siempre iría a redirigir al mismo URL de destino. Puedes comprobarlo si simplemente borras la caché del navegador. En ese caso se volverá a procesar la URL, haciendo el tratamiento que hayas programado, dado que el navegador se habría olvidado de la redirección 301.

La solución es muy sencilla, usar una redirección 302 que indica que es temporal. Una redirección 302 no se cachea en el navegador, porque no indica que sea permanente y por tanto cada vez te puede llevar a un destino diferente. De ese modo, tu proceso se ejecutará siempre y tendrás el comportamiento deseado para tu aplicación.

Debes tener en cuenta que las redirecciones 301 sólo se deben usar cuando realmente sean permanentes y nunca cuando esas redirecciones puedan cambiar de destino, o se deban procesar datos antes de realizar la redirección como en tu caso. Si no deseas cachear la redirección en el navegador, usa 302.

header("HTTP/1.1 302 Moved Temporarily");
header("Location: /index.php");
Norberto
223 5 19 15