Файлов .htaccess на сервере может быть несколько. Он влияет на тот каталог сайта, в котором находится, а так же вложенные каталоги. Причем, нижнего уровня переопределяет настройки аналогичного файла более высокого уровня. То есть, если один файл .htaccess находится в каталоге: www/, а другой находится в каталоге: www./directory/, они содержат одинаковые инструкции с различными параметрами, то для раздела www/directory/, а так же вложенных разделов будут применяться параметры которые находятся в файле www./directory/.htaccess, а для остальных - параметры, находящиеся в файле www/.htaccess.
Для чего нужен файл .htaccess?
Файл .htaccess предназначен для индивидуальной настройки сайтов и их каталогов. С его помощью легко внести локальные изменения в настройки сервера, не обладая правами администратора сервера (если обработка файла .htaccess разрешена администратором). Он влияет только на каталог, его содержащий и вложенные каталоги. Этот волшебный файл может содержать большинство инструкций, допустимых в главном файле конфигурации сервера httpd.conf.
Файл дополнительной конфигурации .htaccess широко используют для замены стандартных сообщений об ошибках (в частности для обработки ошибки 404), ограничения доступа к файлам и каталогам сайта, настройки переадресации, указания стартовой страницы, определения кодировки файлов, обработки php кода в html-документах и прочего. Далее рассмотрим наиболее значимые из этих возможностей, но сначала разберемся, как создать правильный файл дополнительной конфигурации, где он должен находиться и рассмотрим возможные ошибки при его создании.
Как создать файл .htaccess
Файл .htaccess можно создать при помощи Вашего любимого текстового редактора. Просто создаем новый файл, сохраняем в кодировке ANSI и при сохранении присваиваем ему имя ".htaccess". Если вы работаете на Windows или MacOS, так же необходимо преобразовать формат окончания строк в UNIX-формат, иначе сервер, с загруженным на него файлом .htaccess будет выдавать 500 ошибку.
Теперь подробнее, как это можно сделать при помощи бесплатного текстового редактора Notepad ++, скачать который можно здесь:
Открываем текстовый редактор и он автоматически создает новый файл. Если новый файл программой не создан, создаем его сочетанием клавиш ctrl + N или выбрав команду "новый" в меню "файл":
Заходим в меню "кодировки", чтобы убедится, что кодировка нашего файла ANSI, если кодировка UTF или UCS, то легким кликом мыши преобразовываем ее:
Находим в меню "Правка" подменю "Конверсия конца строки" и меняем в нем кодировку на Unix-формат:
Нажимаем на изображение дискетки либо сочетание клавиш ctrl + S, либо выбираем команду "сохранить" или "сохранить как" в меню "файл". В появившемся диалоговом окне выбираем директиву для сохранения, в поле "тип файла" выбираем "all types" (все типы), в поле "имя файла" пишем ".htaccess", нажимаем "сохранить".
Если в файле .htaccess заданы настройки для всего сайта, то помещаем его в корневой каталог сайта, если же он содержит настройки какого-то раздела, то помещаем его в соответствующий раздел.
Проверяем сайт на наличие ошибок. Если сервер выдает ошибку 500, значит, где-то допущена ошибка. Проверьте синтаксис файла, еще раз проверьте кодировку и формат переноса строк. Самая распространенная причина, почему после загрузки файла .htaccess на сервер, появляется ошибка 505 (ошибка сервера), это неправильная кодировка в файле .htaccess.
Замена стандартных сообщений об ошибках при помощи файла .htaccess. Обработка ошибки 404
С помощью файла дополнительной конфигурации веб-сервера apache можно легко заменить стандартные сообщения об ошибках на свои собственные. Например, настроить обработку ошибки 404. Ошибка 404 говорит о том, что сервер не может найти данные, согласно запросу. Например, какая-то страница Вашего сайта была удалена или перенесена, а ссылка на нее по-прежнему стоит где-то в дебрях интернета. Если пользователь перейдет по этой ссылке, то получит ответ сервера с ошибкой 404. После чего, скорее всего, сразу закроет в кладку, даже не пытаясь найти переехавшую страницу.
Однако, если вместо стандартного сообщения об ошибке будет загружаться какая-то html страница с ссылками на главную или на карту сайта, то пользователь с большей вероятностью останется на сайте.
Можно при ошибке 404 отправить пользователя, например, на главную страницу сайта при помощи следующего кода:
ErrorDocument 404 http://www.ваш_сайт.ru/
В коде необходимо заменить http://www.ваш_сайт.ru/ на адрес Вашего сайта.
Однако, такое перенаправление не всегда удобно. Пользователь может не понять, по какой причине его выбрасывает на главную страницу сайта. Для обработки 404 ошибки лучше создать дополнительный html-файл с сообщением об этой ошибке и отправить пользователя на него:
ErrorDocument 404 http://www.ваш_сайт.ru/404.html
В данном случае это файл 404.html, находящийся в корневом каталоге сайта http://www.ваш_сайт.ru/
Оформить эту страницу Вы можете на свой вкус, но, желательно, чтобы она содержала ссылки на главную и на карту сайта.
Так же достаточно распространенными ошибками являются ошибка 401 (Требуется авторизация), 403 (пользователь не прошел аутентификацию, доступ запрещен), 500 (Внутренняя ошибка сервера, например, в синтаксисе или кодировке файла .htaccess). Их обработка происходит по тому же принципу:
ErrorDocument 401 http://www.ваш_сайт.ru/401.html
ErrorDocument 403 http://www.ваш_сайт.ru/403.html
ErrorDocument 500 http://www.ваш_сайт.ru/500.html
Редирект с помощью файла .htaccess
Редирект (от английского redirect - переадресовать) - перенаправление пользователя с одного адреса на другой. С помощью файла .htaccess возможно осуществить несколько видов редиректа:
permanent (301 - документ перемещен постоянно)
temp (302 - документ перемещен временно)
seeother (303 - смотри другой)
gone (410 - убран)
Редирект 301
Наиболее часто используемым является редирект 301, который говорит о том, что сайт переехал навсегда. Изначально эта директива использовалась в том случае, когда сайт перемещался на новый домен, чтобы не терять pr сайта и его позиции в выдаче поисковых систем. Код такого редиректа выглядит следующим образом:
RedirectPermanent / http://новый _сайт.ru/
Файл .htaccess, содержащий эту строчку размещается на старом домене, и все пользователи, а так же поисковые роботы, со старого сайта перенаправляются на новый. Таким образом новый сайт не теряет пользователей и pr старого сайта.
Так же возможно сделать 301 редирект с конкретных страниц сайта на другие страницы. Например, если наш сайт поменял свою структуру. Нужно это, опять же, для того, чтобы не терять трафик, ведь в выдаче поисковых систем, после изменения структуры сайта, какое-то время будут ссылки на старые страницы. Так же некоторые страницы могли попасть в закладки пользователей, на эти страницы могли остаться ссылки на сайтах, так что, чтобы не отправлять пользователя лишний раз на страницу с 404 ошибкой, лучше настроить 301 редирект при изменении структуры сайта. Итак, сделать 301 редирект с одной внутренней страницы сайта на другую можно следующим образом:
Redirect 301 /старая_страница.html http://www.ваш_сайт.ru/новая_страница.html
В данном случае работает редирект 301 со страницы http://www.ваш_сайт.ru/старая_страница.html на страницу http://www.ваш_сайт.ru/новая_страница.html
Склейка зеркал при помощи 301 редиректа
Редирект 301 так же используют для переадресации страниц с префиксом www на страницы без www или наоборот. Дело в том, что для поисковых систем сайт ваш_сайт.ru - это два сайта с одинаковым содержанием, имеющие адреса: http://www.ваш_сайт.ru/ и http://ваш_сайт.ru. Такие сайты (сайты с одинаковым содержанием) называются зеркалами. И различные пользователи ставят различные ссылки на Ваш сайт. Где-то стоят ссылки на сайт с www, где-то - на сайт без www. Таким образом, часть тиц и pr уходят с одного сайта на другой. Чтобы этого не происходило, и поисковые машины считали два этих сайта одним, произвести "склейку зеркал", то есть перенаправить пользователей и поисковых роботов с сайта с префиксом www на сайт без www или наоборот. Для этого в файле .htacces надо написать:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.ваш_сайт.ru
RewriteRule (.*) http://ваш_сайт.ru/$1 [R=301,L]
либо:
RewriteEngine On
>RewriteCond %{HTTP_HOST} ^ваш_сайт.ru
RewriteRule (.*) http://www.ваш_сайт.ru/$1 [R=301,L]
В первом случае мы настроили переадресацию со всех страниц сайта с префиксом www на аналогичные страницы сайта без www. Во втором случае - наоборот.