Редирект с ПРОПИСНЫХ на строчные в URL

Редирект с ПРОПИСНЫХ на строчные в URL

Редирект через htaccess и php

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} [A-Z]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule (.*) /rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]

Если нужно обрабатывать только урлы на латинице, не трогая кириллицу, то такой вариант используем

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} [A-Z]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9/_\-.]+)$ /rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]

Создаем файл в корне сайта с названием rewrite-strtolower.php и содержимым

<?
	if(isset($_GET['rewrite-strtolower-url'])) {
	    $url = $_GET['rewrite-strtolower-url'];
	    unset($_GET['rewrite-strtolower-url']);        
	    $params = strtolower(http_build_query($_GET));
	    if(strlen($params)) {
	        $params = '?' . $params;
	    }
	    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.');
?>

Если у вас на сайте стоит плагин Rank Math, то поправьте код в htaccess на такой

RewriteCond %{REQUEST_URI} [A-Z]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_URI} !/wp-json.* [NC]
RewriteRule (.*) /rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]

Более защищенная версия в плане безопасности

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} [A-Z]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/rewrite-strtolower\.php$
RewriteRule (.*) /rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]

Не забываем поменять значения переменной $host и добавть туда свой домен!!!

<?php

if (isset($_GET['rewrite-strtolower-url'])) {

    // Берём только путь, без схемы/домена
    $url = parse_url($_GET['rewrite-strtolower-url'], PHP_URL_PATH);

    // Защита от пустого / некорректного значения
    if ($url === null) {
        header("HTTP/1.0 400 Bad Request");
        exit;
    }

    unset($_GET['rewrite-strtolower-url']);

    // Собираем параметры БЕЗ изменения регистра
    $params = http_build_query($_GET);
    if ($params) {
        $params = '?' . $params;
    }

    // Жёстко фиксируем домен
    $host = 'site.ru';

    // Убираем лишние слэши в начале
    $url = ltrim($url, '/');

    // Формируем итоговый URL
    $location = 'https://' . $host . '/' . strtolower($url) . $params;

    header('Location: ' . $location, true, 301);
    exit;
}

// Если параметр не передан
header("HTTP/1.0 404 Not Found");
echo 'Unable to convert the URL to lowercase.';
exit;

?>

Если несколько доменов используется на сайте, меняем переменные $allowed_hosts и $host на свои домены

<?php

if (isset($_GET['rewrite-strtolower-url'])) {

    // Берём только путь (без домена и схемы)
    $url = parse_url($_GET['rewrite-strtolower-url'], PHP_URL_PATH);

    if ($url === null) {
        header("HTTP/1.0 400 Bad Request");
        exit;
    }

    unset($_GET['rewrite-strtolower-url']);

    // Собираем query-параметры без изменения регистра
    $params = http_build_query($_GET);
    if ($params) {
        $params = '?' . $params;
    }

    // Белый список доменов
    $allowed_hosts = [
        'your-site.com',
        'www.your-site.com'
    ];

    // Дефолтный домен
    $host = 'your-site.com';

    if (isset($_SERVER['HTTP_HOST'])) {
        // Убираем порт (если вдруг есть)
        $incoming_host = strtolower(preg_replace('/:\d+$/', '', $_SERVER['HTTP_HOST']));

        if (in_array($incoming_host, $allowed_hosts, true)) {
            $host = $incoming_host;
        }
    }

    // Чистим путь
    $url = ltrim($url, '/');

    // Формируем финальный URL
    $location = 'https://' . $host . '/' . strtolower($url) . $params;

    header('Location: ' . $location, true, 301);
    exit;
}

// Если нет параметра
header("HTTP/1.0 404 Not Found");
echo 'Unable to convert the URL to lowercase.';
exit;

Описание

Данный редирект помогает устранить проблему дублирования контента из-за возможности нахождения букв разного регистра в URL-адресе. Например, 2 адреса: https://site.ru/category/plita и https://site.ru/category/Plita для поисковых систем это две отдельные страницы, несмотря на то, что на них находится одинаковый контент. И это будет в глазах робота дублями, со всеми вытекающими в виде понижения позиций и трафика.

Убирается довольно-таки легко, но в отличие от обычных редиректов, тут надо еще создать дополнительный файл PHP, к которому будет обращаться редирект.

Сразу хотел бы предостеречь, что если у вас есть названия товаров с разным регистром, а-ля https://site.ru/catalog/kassety-VHS, то подобный урл также будет приведен к нижнему регистру, а все ссылки в меню, контенте будут вести через 301 редирект. Поэтому если у вас прям много таких URL’ов, а сайт имеет хорошие позиции и трафик, то я бы задумался, стоит ли игра свеч и возможно лучшим способом будет не трогать то, что работает и приносит трафик.

В других же случаях, изначально лучше подавать в поле алиаса документа значение в нижнем регистре, настраивать редирект и не беспокоиться, что возникнут дубли из-за букв разного регистра.

Опубликовал(а)Teh
Предыдущая запись
Убрать index.php и index.html из URL
Следующая запись
Редирект при смене URL категории
Добавить комментарий
Ваш электронный адрес не будет опубликован. Обязательные поля помечены *