Когда htaccess не в радость...
На форумах часто встречаются просьбы помочь сделать редирект, при этом переписка может с почти равной вероятностью заканчиваться положительно "Спасибо, сработало!" или безрадостно "Неужели никто не знает?"
Этому есть объективные причины. Директивы могут отличаться для разных вариантов серверов. Обращаться к правке .htaccess веб-разработчикам приходится не так часто, как, например, к .css, .js. Реализация ЧПУ может обладать определенной уникальностью для конкретного сайта, например, все запросы могут идти не через index.php, а anyname.php, и новичок может не сразу сообразить, что "рецепты", предлагаемые ему Интернет-сообществом, надо редактировать под эту особенность. Ну и, наконец, в наш век дефицита времени и денег вполне может оказаться нецелесообразным изучение языка регулярных выражений и стандартных директив, когда ответ на любой вопрос можно за пару минут отыскать в Сети.
У каждого веб-разработчика есть небольшая библиотечка готовых директив htaccess для создания аккуратных ЧПУ, создания перенаправлений, задания паролей на папки, ограничения доступа, обработки ошибок и т. д.
Те, у кого такой библиотечки нет, могут использовать в числе других и эту скромную заметку.
Пример 1
Удаляем дубль вида https://capweb.ru?p=1, где вместо 1 может быть любое число.
RewriteCond %{QUERY_STRING} ^p=(.+)$ RewriteRule (.*) $1? [R=301,L]
Пример 2
То же самое, немного по-другому. Удаляем дубль вида https://capweb.ru?page=1 (убираем хвост от ? и до конца, в конце только конкретное число).
RewriteCond %{QUERY_STRING} (^|&)page=1($|&) RewriteRule (.*) $1? [R=301,L]
Пример 3
Рецепты для Bitrix
RewriteEngine On # Директива включает редиректы. RewriteBase / # Без директивы (.*) = /$1 будет /var/wwww/site/web/$1 с директивой = /$1 Options +FollowSymLinks # Разрешает переход по символическим ссылкам. ############################################################################ #### Перенаправляем протокол https на http #### ############################################################################ #RewriteCond %{HTTPS} On # Проверяем наличие https в URL. #RewriteRule ^.*$ http://%{SERVER_NAME}%{REQUEST_URI} #RewriteCond %{HTTP:X-Forwarded-Protocol} =https #RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] #RewriteCond %{ENV:HTTPS} on #RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # Перенаправляем протокол на http. ############################################################################ #### Выбор основного зеркала (или с www или без www) #### ############################################################################ # 1. Редирект с www на без www. (раскоментировать директивы пункта 1) #RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] # Проверяем, содержит ли домен www (в начале URL). #RewriteRule ^(.*)$ http://%1/$1 [R=301,L] # Перенаправляем URL на домен без www. #### # 2. Редирект без www на www. (раскоментировать директивы пункта 2) RewriteCond %{HTTP_HOST} !^www\.(.*) [NC] # Проверяем, не содержит ли домен www (в начале URL). RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] # Перенаправляем URL на домен c www. ############################################################################ #### Убираем повторяющиеся слеши (/) в URL #### ############################################################################ RewriteCond %{THE_REQUEST} // RewriteRule .* /$0 [R=301,L] ############################################################################ #### Убираем слеши в конце URL для статических файлов (содержит точку) #### ############################################################################ RewriteCond %{REQUEST_URI} \..+$ # Если файл содержит точку. RewriteCond %{REQUEST_FILENAME} !-d # И это не директория. RewriteCond %{REQUEST_FILENAME} -f # Является файлом. RewriteCond %{REQUEST_URI} ^(.+)/$ # И в конце URL есть слеш. RewriteRule ^(.+)/$ /$1 [R=301,L] # Исключить слеш. ############################################################################ #### Добавляем слеш(/), если его нет, и это не файл. #### ############################################################################ RewriteCond %{REQUEST_URI} !(.*)/$ # Если слеша в конце нет. RewriteCond %{REQUEST_FILENAME} !-f # Не является файлом. RewriteCond %{REQUEST_URI} !\..+$ # В URL нет точки (файл). RewriteRule ^(.*)$ $1/ [L,R=301] # Добавляем слеш в конце. ############################################################################ #### Убираем index.php, если он есть в конце URL #### ############################################################################ RewriteCond %{REQUEST_METHOD} =GET # Выявляем GET запрос в URL (не POST). RewriteCond %{REQUEST_URI} ^(.*)/index\.php$ # URL cодержит index.php в конце. RewriteRule ^(.*)$ %1/ [R=301,L] # Удалить index.php из URL. ############################################################################ #### Компрессия статического контента для гугл спид тест #### ############################################################################# Compress HTML, CSS, JavaScript, Text, XML and fonts AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-font AddOutputFilterByType DEFLATE application/x-font-opentype AddOutputFilterByType DEFLATE application/x-font-otf AddOutputFilterByType DEFLATE application/x-font-truetype AddOutputFilterByType DEFLATE application/x-font-ttf AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE font/opentype AddOutputFilterByType DEFLATE font/otf AddOutputFilterByType DEFLATE font/ttf AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE image/svg+xml ExpiresActive on ExpiresByType image/jpeg "access plus 3 day" ExpiresByType image/svg "access plus 3 day" ExpiresByType image/gif "access plus 3 day" ExpiresByType image/png "access plus 3 day" ExpiresByType text/javascript "access plus 3 day" ExpiresByType text/css "access plus 3 day" ExpiresByType application/javascript "access plus 3 day"
Пример 4
Испытано на Bitrix
Задача: сделать редирект со всех статей вида https://capweb.ru/company/1/ на https://capweb.ru/stati/1.php с некоторыми исключениями.
Решение:
RewriteCond %{REQUEST_URI} ^/company/(.*)$ RewriteCond %{REQUEST_URI} !/company/o-produktsii(.*)$ RewriteCond %{REQUEST_URI} !/company/kontraktnoe-proizvodstvo(.*)$ RewriteCond %{REQUEST_URI} !/company/materialy-dlya-skachivaniya(.*)$ RewriteCond %{REQUEST_URI} !/company/jobs(.*)$ RewriteRule ^company/(.*)/ https://capweb.ru/stati/$1.php [L,R=301]
Пример 5
Испытано на tm-koleso.ru (WordPress)
Задача: сделать редирект со всех статей вида https://tm-koleso.ru/2021/05/01/kak-vybrat-avtoservis/ на https://tm-koleso.ru/kak-vybrat-avtoservis.html. Именно так и нужно было делать изначально, но прежние владельцы сайта пренебрегли элементарными знаниями об уровнях вложенности страниц и их влиянии на ранжирование. Поэтому ставим флажок в настройках постоянных ссылок на /%postname%.html и делаем редирект.
Решение:
RewriteRule ^(.*)/(.*)/(.*)/(.*)/$ https://tm-koleso.ru/$4.html [R=301,L]
RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/$ https://tm-koleso.ru/$4.html [R=301,L] RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/$ https://tm-koleso.ru/$4.html [R=301,L] RewriteRule ^(.*)/(.*)/(.*)/(.*)/$ https://tm-koleso.ru/$4.html [R=301,L]
Пример 6
Вот такую дрянь обнаружил в индексе в декабре 2023 г.: https://tm-koleso.ru/gaz-310221-universal.html/attachment/310221. Сайт мой, дохода особо не приносит, но тем не менее. Решил просто редиректить с убиранием всего, что после .html, причем эту директиву пришлось закинуть в начало, иначе получалось циклическое перенаправление.
RewriteRule ^(.*\.html).*$ $1 [R=301,L]
Пример 7
Вот такую дрянь обнаружил в индексе в феврале 2024 г.: https://wedding52.ru/index.php/tuaj.html и много подобных. Если на сайте есть такая уязвимость, ей легко могут воспользоваться злоумышленники, чтобы загнать в индекс тучу дублей ваших страниц. Не забываем про Canonical и убираем index.php в центре url.
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /index\.php/[^\ ]+ RewriteRule ^index\.php/(.*)$ /$1 [L,R=301]
Пример 8
okoge.ru. Купил на www.telderi.ru, был в ужасном состоянии, до сих пор привожу в порядок. Исторически так сложилось, что все канонические страницы были без слеша и без .html на конце, при этом те же урлы открывались и со слешом. Лечение (редирект со слеша):
RewriteCond %{HTTP_HOST} (.*) RewriteCond %{REQUEST_URI} /$ [NC] RewriteRule ^(.*)(/)$ $1 [L,R=301]
Продолжение следует...
Следующая статья: Как выкинуть деньги на SEO и обанкротить интернет-магазин https://capweb.ru/kak_vyikinut_dengi_na_seo_i_obankrotit_internet-magazin.html
Предыдущая статья: С чего начинается создание сайта https://capweb.ru/s_chego_nachinaetsya_sozdanie_sajta.html