Статьи

Как избежать 404-х и перенаправить старые URL-адреса в PHP

Ничего нельзя сказать наверняка, кроме смерти и налогов. И URL-адреса меняются. Часто бывает необходимо реорганизовать ваш сайт и изменить структуру URL-адреса, но, если у вас похожий контент, пользователи редко сталкиваются с ошибкой «страница не найдена». Создание ненужных 404 страниц — одна из моих 10 ошибок разработки. В этой статье мы создадим автоматизированную систему перенаправления PHP, которая преобразует старые URL-адреса в новый адрес. Это не рабочий код, но он иллюстрирует основы, так что вы можете адаптировать его для своего собственного сайта.

1. Создайте файл обработки ошибок 404

Если у вас еще нет страницы «не найден», создайте базовую страницу 404.php в корне вашего сайта:

<?php// basic 404 error pageheader('HTTP/1.1 404 Not Found');header('Status: 404 Not Found');?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Page not found</title></head><body><h1>Page not found</h1><p>Sorry, we cannot find that page.</p><p><a href="/">Please return to the home page&hellip;</a></p></body></html>
Примечание: что такое 404?

404 — это номер ошибки HTTP, возвращаемый, когда ресурс не может быть найден на сервере. Код PHP в верхней части приведенного выше файла возвращает этот код, чтобы гарантировать, что такие системы, как поисковые системы, не примут страницу за реальный контент.

2. Настройте свой сервер

Теперь вам нужно сообщить серверу, что все ошибки 404 должны обрабатываться файлом 404.php. Если вы используете Apache, добавьте следующую строку в файл .htaccess в корне вашего сайта:

 errordocument 404 /404.php

Для IIS откройте диспетчер служб IIS. В IIS7 дважды щелкните значок «Страницы ошибок». (Пользователи предыдущих версий должны выбрать вкладку «Пользовательские ошибки» в свойствах веб-сайта.) Отредактируйте код ошибки 404, выберите тип «URL» и введите «/404.php» в качестве адреса. Если вы сейчас посещаете на несуществующей странице, такой как http://yoursite.com/non-existent.url, вы должны увидеть страницу с ошибкой, которую мы создали выше.

3. Создать систему перенаправления

Мы поместим наш код перенаправления в другой файл с именем redirect.php , чтобы отделить функциональность от содержимого 404. Добавьте следующий код вверху файла 404.php сразу после объявления <? Php:

 include('redirect.php');

Теперь создайте redirect.php в корне сайта и добавьте следующий код:

 <?php// current address$oldurl = strtolower($_SERVER['REQUEST_URI']);// new redirect address$newurl = '';

Текущий адрес страницы хранится в $ oldurl, например, /non-existent.url. Теперь нам нужно проверить этот адрес и, если возможно, перевести его на новый URL (хранится в переменной $ newurl). Как это будет достигаться, будет зависеть от структуры ваших старых и новых URL. Например, если единственное изменение состоит в том, что ваша папка «блог» была переименована в «блоги», может быть достаточно следующего кода:

 $newurl = str_replace('blog', 'blogs', $oldurl);

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

 $redir = array(	'blog' => '/blogs/',	'video' => '/videos/',	'demo' => '/demonstrations/main/');while ((list($old, $new) = each($redir)) && !$newurl) {	if (strpos($oldurl, $old) !== false) $newurl = $new;}

Массив $ redir определяет количество пар значений, которые можно настроить соответствующим образом. Если первая строка может быть найдена в любом месте старого URL, адрес перенаправления устанавливается на вторую строку. В приведенном выше примере, если в URL отсутствующей страницы найдено слово «блог», пользователь будет перенаправлен на «/ blogs /». Если старый URL содержит два или более из этих слов, первое имеет приоритет; например, / video / демонстрации сначала найдут «video» и перенаправят на «/videos/». Как только у вас есть значение $ newurl, вы можете дополнительно проверить, существует ли оно перед перенаправлением. К сожалению, это создает несколько рисков:

  • Новый URL может не иметь физического файла; Например, вы используете постоянные ссылки WordPress. Функция PHP file_exists () не сможет ничего найти.
  • Вы можете использовать функцию, такую ​​как file () или http_get (), чтобы проверить, что URL существует; однако, если этого не произойдет, вы в конечном итоге вернетесь к файлу redirect.php, что может привести к рекурсивным попыткам перенаправления.

Лично я бы избегал двойной проверки URL, если это не легко сделать. Если ваши URL-адреса перенаправления неверны, это скоро станет очевидным во время тестирования или изучения файлов журнала вашего сервера. Наконец, если у нас есть $ newurl, мы перенаправим на эту страницу. В противном случае мы покажем ошибку 404.php:

 // redirectif ($newurl != '') {	header('HTTP/1.1 301 Moved Permanently');	header("Location: $newurl");	exit();}?>

Этот код является простым примером, но вы должны быть в состоянии адаптировать его для любой ситуации. Вы также можете рассмотреть дополнительные варианты, такие как:

  • протоколирование всех неотображенных URL-адресов в файл для последующей проверки
  • предотвращение множественных ошибок перенаправления путем сохранения файла cookie, использования значения сеанса или передачи аргумента на новый URL

Я надеюсь, что вы найдете это полезным. Я покажу вам, как изменить код для установки WordPress в новой статье SitePoint, которая скоро появится …