Как сделать переадресацию без кэширования 301?

Некоторое время назад все браузеры изменили свое поведение и начали кэширование 301 переадресаций, я хотел бы знать, как сделать 301 перенаправление, которое не кэшируется в php?

301 является постоянной переадресацией, поэтому кэширование имеет смысл. Если ваше перенаправление не является постоянным, используйте 307 (временное перенаправление), 302 (найдено) или 303 (см. Другое).

См. Здесь соответствующие варианты использования.

Чтобы уточнить различия между этими тремя:

  • 307 – это общая временная переадресация, когда перемещается ресурс. Например, URL-адрес, например domain.com/news/latest может перенаправить 307 на последнюю новостную статью, domain.com/news/article-594873 . Поскольку это временное перенаправление может сохраняться некоторое время (эта конкретная статья может быть последней в течение нескольких часов), браузеры могут кэшировать перенаправление. Чтобы контролировать степень, в которой они работают, используйте заголовки управления кешем.
  • 303 – это перенаправление, которое нельзя кэшировать, когда-либо. Например, POSTing новой статьи в domain.com/news может создать новую новостную статью, а перенаправление 303 на нее предоставляется domain.com/news/article-978523 . Поскольку другой запрос POST приводит к совершенно другой, создаваемой новой статье, ее нельзя кэшировать.
  • 302 немного страннее, я никогда не использовал его сам. По-видимому, это скорее заменитель устаревших 303, для более ранних клиентов версии 1.0 HTTP, которые не понимают 303.

Поскольку вы спросили конкретно о 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 } 

Вы также можете остановить агенты от кеширования 301, если нужно, используя вышеупомянутые заголовки управления кешем, например:

 header_no_cache(); header_redirect_permanent($url); 

или просто добавить

 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; 

Код 301 статуса http без кеширования может использоваться для канонизации URL-адресов, сохраняя при этом функциональность отслеживания.

Чтобы предотвратить переадресацию 301-кеширования, просто установите заголовки управления кэшем, затем вы можете отменить перенаправление, а клиенты (бот и браузеры) больше не будут перенаправлены.

 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; 

Это полезно, когда вы хотите, чтобы браузеры обновляли URL-адрес в закладках и ботах для обновления своего индекса, но все же могли отслеживать их или отменять перенаправление, перенаправляя обратно к исходному URL-адресу, не вызывая бесконечных циклов или других глупостей.

Это никоим образом не означает, что код 301 должен использоваться для всех перенаправлений, напротив, разные виды перенаправления имеют разные коды состояния, которые Core Xii суммирует.

Ответ Core Xii правильный.

Однако, чтобы добавить к этому, вы можете использовать плагин для разработчиков Firefox / Chrome для очистки перенаправлений и кэшей DNS.