Настройка .htaccess

Файл .htaccess является конфигурационным файлом Apache. Он позволяет задать реакцию сервера на запросы пользователя, настроить кэширование и сжатие, а также разграничить доступ к различным разделам сайта,

Возможности, которые предоставляет htaccess для конфигурации сервера слишком велики, чтобы уместиться в одной статье, но мы не собираемся рассматривать все тонкости конфигурации Apache, а рассмотрим лишь базовые настройки .htaccess для уменьшения дубликатов страниц на сайте.


Во-первых, на сайте имеется дубликат главного зеркала, сайт открывается как с www, так и без него.

Такое положение дел плохо тем что:

  • Путает пользователя относительно правильности названия сайта
  • Ухудшает запоминание название сайта пользователем
  • Мешает поисковым роботам адекватно воспринимать страница сайта (поисковые роботы считают страницы с www и без www разными, а контент на них дублируемым)

Для избавления от дубликата главного зеркала в .htaccess необходимо прописать:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^crazysquirrel\.ru$ [NC]
RewriteRule ^(.*)$ https://crazysquirrel.ru/$1 [R=301,L]

Для настройки в качестве основного зеркала сайта название без www

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.crazysquirrel\.ru$ [NC]
RewriteRule ^(.*)$ https://www.crazysquirrel.ru/$1 [R=301,L]

Для настройки в качестве основного зеркала названия с www


Во-вторых, на сайте имеются дубликат головного файла сайта (index.html, index.php и т.д.)

Такое положение дел плохо тем что:

  • Ухудшает вид основной страницы сайта (гораздо приятнее видеть имя сайта без всяких index нежели сними)
  • Мешает поисковым роботам адекватно воспринимать страница сайта (поисковые роботы считают адрес сайта с index и без него как разные страницы, а контент на них дублируемым)

Для избавления от дубликатов головного файла сайта необходимо прописать в .htaccess:

RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ https://crazysquirrel.ru/$1 [R=301,L]

В-третьих, дубликаты GET (параметров передаваемых в url после знака ?)

Такое положение дел плохо тем что:

  • Ухудшает вид основной страницы сайта (гораздо приятнее видеть URL без GET параметров нежели сними)
  • Мешает поисковым роботам адекватно воспринимать страница сайта (поисковые роботы считают адрес сайта с GET и без него как разные страницы, а контент на них дублируемым)

Для избавления от дубликатов GET необходимо прописать в .htaccess:

RewriteEngine on
RewriteCond %{QUERY_STRING} !^$ [NC]
RewriteCond %{THE_REQUEST} \? [NC]
RewriteCond %{THE_REQUEST} !admin [NC]
RewriteRule ^(.*)?(.*)$ https://crazysquirrel.ru/$1? [R=301,L]

Общее правило для избавления от дубликатов:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^crazysquirrel\.ru$ [NC]
RewriteRule ^(.*)$ https://crazysquirrel.ru/$1 [R=301,L]
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ https://crazysquirrel.ru/$1 [R=301,L]
RewriteCond %{QUERY_STRING} !^$ [NC]
RewriteCond %{THE_REQUEST} \? [NC]
RewriteCond %{THE_REQUEST} !admin [NC]
RewriteRule ^(.*)?(.*)$ https://crazysquirrel.ru/$1? [R=301,L]

В данных конфигурациях:

  • RewriteEngine on — директива включения/выключения механизма преобразования (пишется одна на весь htaccess)
  • RewriteCond %{HTTP_HOST} !^crazysquirrel\.ru$ [NC] — определение условия для применения преобразования только к названиям сайта, отличным от нужного
  • RewriteRule ^(.*)$ https://crazysquirrel.ru/$1 [R=301,L] — механизм преобразования перенаправляющий пользователя на «правильное имя сайта»
  • RewriteCond %{QUERY_STRING} !^$ [NC] — определяет условие для применения преобразования только к адресам у которых есть GET параметры
  • RewriteCond %{THE_REQUEST} ? [NC] — определяет условие преобразования только для адресов имеющим ?
  • RewriteCond %{THE_REQUEST} !admin [NC] — определяет правила преобразования для адресов не имеющим в своем составе дирректории или файла административной панели сайта (если на сайте нет CMS или для её работы не требуются GET параметры, данную строчку можно не писать)
  • crazysquirrel.ru — название сайта
  • admin — директория административной панели сайта
  • index.php — главный файл сайта
  • R=301 — флаг, устанавливающий код состояния http для неправильного сайта (301 — флаг постоянной смены адреса)
  • L — флаг, указывающий, что данное правило последнее
  • NC — флаг, указывающий, что для данного правила не важен регистр написания