Редирект через 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’ов, а сайт имеет хорошие позиции и трафик, то я бы задумался, стоит ли игра свеч и возможно лучшим способом будет не трогать то, что работает и приносит трафик.
В других же случаях, изначально лучше подавать в поле алиаса документа значение в нижнем регистре, настраивать редирект и не беспокоиться, что возникнут дубли из-за букв разного регистра.




