Как перевести URL в нижний регистр

Опубликовано Опубликовано в рубрике Easy Patch, PHP, SEO

Сегодня я хочу поговорить об одном подводном камне поисковой оптимизации сайтов — обработке адресов в различных регистрах. Как показывает практика, далеко не всегда поисковики воспринимают страницы www.site.ru/PluShki и www.site.ru/plushki одинаково. Что же нужно делать, чтобы решить эту проблему?

Заплатка тут будет крохотная, но полезная.

Все та же практика показывает, что не на всех хостингах сработает перевод адреса в нижний регистр при помощи файла .htaccess. Логично будет добавить дополнительный заголовок перенаправления в нужный файл логики php.

Однако, если мы просто добавим перенаправление на нижний регистр, то получим циклический 301 редирект, ведь скрипт будет проверять url каждый раз при вызове страницы, в т.ч. и после редиректа. А это, сами понимаете, нехорошо.

Значит необходимо задать какое-то условие. Условимся о переводе url строго в нижний регистр. Для этого мы будем использовать функцию mb_strtolower(). Условие здесь будет достаточно простым — мы проверям, состоит ли строка только из символов нижнего регистра. Для этого берем наш адрес, выкидываем из него слеши и проверяем символы.

Такую полезную работу выполняет функция ctype_lower() (или её «отражение» — ctype_upper(), которая проверяет, все ли символы в верхнем регистре). Функция возвращает TRUE, если все символы в нижнем регистре, и FALSE иначе.

Скрипт будет выглядеть так

$uri = $_SERVER[REQUEST_URI];//здесь хранится адрес без имени хоста
$host = $_SERVER[HTTP_HOST];//имя хоста
$uri1 = str_replace ("/", "", $uri);//убираем слэш
$host1 = str_replace ("/", "", $host);
if (!ctype_lower($uri1) || !ctype_lower($host1))
{
	$uri = mb_strtolower($uri);//переводим адрес в нижний регистр
	$host = mb_strtolower($host);//переводим хост в нижний регистр
	header ('HTTP/1.1 301 Moved Permanently');//редиректим
	header("Location: http://".$host.$uri);
}

Таким образом, если у нас в строке есть хоть один символ в верхнем регистре, то сработает 301 редирект, который перепишет наш адрес!

За сим всё!

Безошибочного Вам кода!

Как перевести URL в нижний регистр: 3 комментария

  1. Убирать слэши недостаточно. Мне пришлось убирать еще и точку в доменном имени.

    $uri = $_SERVER[REQUEST_URI]; //здесь хранится адрес без имени хоста
    $host = $_SERVER[HTTP_HOST]; //имя хоста
    $uri1 = str_replace ("/", "", $uri);//убираем слэш
    $host1 = str_replace ("/", "", $host);
    $uri1 = str_replace (".", "", $uri1);//убираем точку
    $host1 = str_replace (".", "", $host1);
    if (!ctype_lower($uri1) || !ctype_lower($host1)) {
        $uri = mb_strtolower($uri); //переводим адрес в нижний регистр
        $host = mb_strtolower($host); //переводим хост в нижний регистр
        header("HTTP/1.1 301 Moved Permanently"); //редиректим
        header("Location: http://" . $host . $uri);
    }
    

    А если был бы дефис — его тоже пришлось бы убирать, наверняка.

  2. И индексы массивов следует использовать строковые, в кавычках или апострофах:

    $_SERVER[REQUEST_URI];

    1. И зачем убирать точку? А если доменное имя третьего или более глубоких уровней?

      Кавычки несильно влияют на суть алгоритма, согласитесь 😉

Добавить комментарий для Александр Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *