¿Cómo hacer un redireccionamiento 301 no almacenado en caché?

Hace un tiempo, todos los navegadores cambiaron su comportamiento y comenzaron a almacenar en caché las redirecciones 301. Me gustaría saber cómo hacer una redirección 301 que no esté almacenada en caché en php.

301 es un redireccionamiento permanente , por lo que el almacenamiento en caché tiene sentido. Si su redireccionamiento no es permanente, use 307 (redireccionamiento temporal), 302 (encontrado) o 303 (vea otro).

Vea aquí para los casos de uso apropiados.

Para explicar las diferencias entre estos tres:

  • 307 es la redirección temporal genérica para cuando se mueve un recurso. Por ejemplo, una URL como domain.com/news/latest podría hacer una redirección 307 al último artículo de noticias, domain.com/news/article-594873 . Dado que esta redirección temporal puede persistir por un tiempo (ese artículo en particular puede ser el último durante varias horas), los navegadores pueden almacenar en caché la redirección. Para controlar el grado en que lo hacen, use encabezados de control de caché.
  • 303 es la redirección que no debe almacenarse en caché, nunca. Por ejemplo, PUBLICAR un nuevo artículo a domain.com/news podría crear un nuevo artículo de noticias, y se proporciona un redireccionamiento 303 a domain.com/news/article-978523 . Como otra solicitud POST da como resultado la creación de un nuevo artículo completamente diferente, no se puede almacenar en caché.
  • 302 es un poco extraño, nunca lo he usado yo mismo. Aparentemente es más un sustituto heredado del 303, para los clientes anteriores de la versión HTTP 1.0 que no entienden el 303.

Ya que preguntaste específicamente sobre PHP:

 < ?php function header_redirect_permanent($url) { header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently', true, 301); header('Location: ' . $url); } function header_no_cache() { header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // past date to encourage expiring immediately } 

También puede detener a los agentes para que guarden en la memoria caché un 301, si es necesario, utilizando los encabezados de control de caché anteriores como este:

 header_no_cache(); header_redirect_permanent($url); 

o simplemente agrega

 header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); header('Location:'.$url, true, 301); exit; 

Se puede usar un código de estado http 301 sin almacenamiento en caché para realizar la canonización de URL mientras se conserva la funcionalidad de seguimiento.

Para evitar que un redireccionamiento 301 se almacene en caché, simplemente configure los encabezados de control de caché, luego puede deshacer el redireccionamiento y los clientes (bot y navegadores) ya no serán redireccionados.

 header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); header('Location:'.$url, true, 301); exit; 

Esto es útil cuando quieres que los navegadores actualicen la URL en los marcadores y bots para actualizar su índice, pero aún así poder rastrearlos o deshacer la redirección redireccionando a la URL original sin causar bucles infinitos u otras tonterías.

Esto de ninguna manera significa que el código 301 tiene que ser utilizado para todas las redirecciones, por el contrario, los diferentes tipos de redirección tienen códigos de estado diferentes que Core Xii resumió.

La respuesta de Core Xii es correcta.

Sin embargo, para agregarlo, puede usar el complemento Firefox / Chrome Developer Tools para borrar el redireccionamiento y las cachés DNS.