Переводим все URL сайта в нижний регистр с помощью Apache rewrite и PHP

Было когда-то в SEO требование — дубли страниц не плодить. И вроде бы нет их, дублей, а тут оппа и в сети на ваш сайт куча ссылок, да не простых, с разным регистром и ооочень много. Например, your_site.com/pagelink, your_site.com/pageliNk, your_site.com/pagElink, your_site.com/paGelink, your_site.com/paGElink и т.д.

Суть в том, что все эти ссылки ведут на одну и ту же страницу, но поисковиком воспринимаются, как разные, как дубли. Вот против такой херни однажды было найдено решение — RewriteRule через rewrite-strtolower-url.

Итак, какое есть решение для Apache? В .htaccess вносим следующее:

RewriteEngine on
RewriteBase /
# force url to lowercase if upper case is found
RewriteCond %{REQUEST_URI} [A-Z]
# ensure it is not a file on the drive first
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]

Что тут происходит:

  1. Настраиваем rewrite module
  2. Проверяем URL на содержание букв в высоком регистре
  3. Удостоверяемся, что URL не ведет на файл на диске
  4. Оправляем все совпадающие запросы по правилу в наш скрипт через GET для преобразования в нижний регистр.

Теперь создаем файл rewrite-strtolower.php и кладем его в корень сайта (туда же, где .htaccess):

<?php
if(isset($_GET['rewrite-strtolower-url'])) {
    $url = $_GET['rewrite-strtolower-url'];
    unset($_GET['rewrite-strtolower-url']);
    $params = http_build_query($_GET);
    if(strlen($params)) {
        $params = '?' . $params;
    }
    //если нет SSL, замените https:// на http://
    header('Location: https://' . $_SERVER['HTTP_HOST'] . '/' . strtolower($url) . $params, true, 301);
    exit;
}
header("HTTP/1.0 404 Not Found");
die('Unable to convert the URL to lowercase. You must supply a URL to work upon.');
?>

Вот и всё! Теперь ссылки с символами в верхнем регистре будут меняться на нижний. Пока что я не нашёл лучшего решения для Apache. Если оно есть, дайте мне знать.

Добавить комментарий

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

пятнадцать + 16 =