Хотите получить хорошую скидку на создание сайта? Закажите брендбук у профессионалов из CapWeb!
+7(910)140-50-90 (Кэп)

Когда 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]
А на самом деле пришлось делат так. Почему — это уже другая история об особенностях WordPress.
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

Позиции сайта Автогарант-НН на апрель 2014 г.
Позиции сайта veragold.ru на декабрь 2014 г.
reative
nalytics
romotion

Оставьте Вашу контактную информацию, и мы свяжемся с Вами!

Получайте горячие новости интернет-маркетинга и вечную скидку 5%!