PHP

Как сделать редирект PHP

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

Основные коды редиректов

  • 301 – текущая страница удалена на всегда, заменой старой считать новый url.
  • 302 – текущая страница временно не доступна, заменой считать пока новый url.
  • 303 – используется после отправки формы методом POST (подробнее Post/Redirect/Get - PRG).

Итак, сделать 301-й редирект можно так: 

header('Location: http://site.com', true, 301);
exit();

Но функция header не сработает если до ее вызова в браузер уже выводился какой-то контент и вызовет ошибку:

Warning: Cannot modify header information - headers already sent by…

Исправить ее можно использовав буферизацию вывода добавив в самое начало скрипта ob_start();

Также можно подстраховаться добавив JS редирект и ссылку если функция header() не сработает.

header('Location: http://site.com', true, 301);
echo "<script>window.location.replace('http://site.com');</script>";
echo 'Перенаправление… Перейдите по <a href="http://site.com">ссылке</a>.';
exit();

Упростить использование кода можно выделив его в отдельную функцию:

function redirect($url, $code = 301)
{
    header('Location: ' . $url, true, $code);
    echo "<script>window.location.replace('" . $url . "');</script>";
    echo 'Перенаправление… Перейдите по <a href="' . $url . '">ссылке</a>.';
    exit();
}

// В index.php
if ($_SERVER['REQUEST_URI'] == '/url-old') {
    redirect('http://site.com/url-new');
}

Если редиректов много:

$urls = array(
    array('/url-old-1', 'http://site.com/url-new-1'), 
    array('/url-old-2', 'http://site.com/url-new-2'), 
    array('/url-old-3', 'http://site.com/url-new-3'),
);
 
foreach ($urls as $row) {
    if ($_SERVER['REQUEST_URI'] == $row[0]) {
        redirect($row[1]);
    }
}
29 октября 2017