Примеры использования .htaccess
Практические примеры использования файла .htaccess
Помощь / Технические вопросы / apache

Пользователям мы предоставляем возможность самостоятельной конфигурации путем использования соответствующих директив в файле .htaccess. Таким образом можно решить большинство задач по конфигурации веб-сервера в условиях массового хостинга.


Индексный файл

 

Индексный файл или файл-индекс — это тот файл, который открывается по умолчанию при обращении пользователя через веб к каталогу, а не к конкретному файлу. Например, ваш посетитель запросит адрес http://ваш_домен/price/, где price — название каталога. Индексный файл это тот файл, который будет показан пользователю при обращении к каталогу без указании имени конкретного файла в нем.

 

По умолчанию индексными файлами являются следующие: index.html, index.php. Если вы хотите чтобы первым открывался какой-то иной файл, нужно переопределить текущие значения. Как это сделать читайте здесь.

 

Назначение и использование файла .htaccess

 

Файл .htaccess может быть размещен в корневом каталоге веб-сервера (прямо в каталоге www). В этом случае директивы из такого .htaccess действуют по всему веб-серверу. Также .htaccess может находиться и в конкретном подкаталоге сервера. Тогда директивы, которые указаны в этом файле, «перекрывают» действие директив из «основного» файла, который размещен в каталоге www или в любом каталоге более высокого уровня. То есть, действие директив из .htaccess наследуется сверху вниз, но не наоборот. Изменения, внесенные в файл, вступают в силу немедленно. Это связано с тем, что информация из .htaccess перечитывается при каждом обращении к веб-серверу. В .htaccess может быть помещено большинство из доступных директив.

 

Обратите внимание, что для корректной работы всех последующих примеров, в начале файла .htaccess должна быть такая строка:

 

RewriteEngine on

 

Пример: как переопределить кодировку html-документов

 

Мы хотим «объяснить» веб-серверу что все html-документы, которые размещены на сервере, нужно «отдавать» клиенту в кодировке koi8-r, а не в windows-1251, как это сервер делает по умолчанию. Для этого поместим в .htaccess строку:

 

AddType "text/html; charset=koi8-r" .html .htm .shtml

 

Получив такой .htaccess, веб-сервер Apache станет выдавать клиентскому браузеру заголовок, в котором будет указано, что документ имеет кодировку koi8-r.

 

Если на вашем ресурсе существуют html-документы в разных кодировках, (ISO-8859-1, Windows-1250, Windows-1252, UTF-8), то вам, возможно, будет необходимо отключить принудительну выдачу заголовка с кодировкой windows-1251. Для этого в .htaccess добавляется строка:

 

AddDefaultCharset Off

 

При этом соответствующая кодировка должна быть прописана на каждой html-странице в виде тега:

<http-equiv="Content-type" content="text/html; charset=windows-1251" />

 

Пример: как закрыть директорию паролем

 

Одна из стандартных задач, которая решается путем использования .htaccess — это ограничение доступа к определенному каталогу на сервере. Например, нужно дать доступ к определенному каталогу отдельным посетителям, снабдив их при этом уникальным логином и паролем.

 

В каталоге, к которому хотим ограничить доступ по паролю, создаем файл .htaccess с такими директивами:

 

AuthType Basic
AuthName "Some Name"
AuthUserFile /home/hXXXXX/data/.htpasswd
require valid-user

 

Путь /home/hXXXXX/data/.htpasswd обозначает полный путь к файлу паролей на диске нашего сервера. Если, например, вы поместите файл .htpasswd (в нем будут пароли) в домашний каталог, куда вы попадаете зайдя на сервер по FTP, то путь к этому файлу будет иметь вид /home/hXXXXX/data/.htpasswd, где hXXXXX — наименование вашей виртуальной площадки (например, h12345).

 

В директиве AuthUserFile указываем абсолютный путь к файлу с логинами/паролями, который мы создадим чуть позже. Если вы создаете файл .htaccess на своем компьютере, а не сразу на сервере при помощи текстового редактора, обратите внимание на то, что .htaccess должен передаваться по FTP строго в текстовом (ASCII) режиме.

 

Создаем файл паролей. Файл с паролями должен содержать строки вида login:password. Пароль должен быть зашифрован с использованием алгоритма MD5. Один из способов создать такой файл — воспользоваться программой, входящей в поставку Apache — htpasswd (на нашем сервере она находится в каталоге /usr/local/bin/, полный путь — /usr/local/bin/htpasswd).

 

Рассмотрим как создать файл паролей в unix shell прямо на сервере. Зайдем в shell, и будем выполнять следующие команды:

 

htpasswd -mbc .htpasswd user1 sNQ7j9oR2w

 

создаем новый файл .htpasswd, в который добавляем запись для пользователя user1 с паролем, указанным в командной строке. Просьба обязательно заменить sNQ7j9oR2w на любой собственный пароль — здесь этот пароль указан только для примера

 

htpasswd .htpasswd user2

 

добавляем в уже существующий файл .htpasswd пользователя user2, а пароль вводим вручную в ответ на соответствующий запрос программы

 

Если вы используете Windows и не хотите пользоваться unix shell для генерации паролей, можно загрузить Windows-версию программы htpasswd здесь и создать файл с паролями на своем компьютере, после чего, загрузить его на сервер. Если у вас уже установлена Windows-версия Apache, файл htpasswd.exe можно найти в каталоге Program Files\Apache Group\Apache\bin\.

 

Итак, получите htpasswd.exe и используйте его для генерации паролей таким образом:

 

htpasswd.exe -mc .htpasswd user1

 

создаем новый файл паролей htpasswd.exe, пароль и его подтверждение будут запрошены интерактивно

 

htpasswd.exe -m .htpasswd user2

 

добавляем пользователя user2 в существующий файл паролей htpasswd.exe, запросив пароль интерактивно

После окончания заведения всех логинов файл нужно загрузить на сервер.

 

Пример: собственные страницы ошибок

 

Иногда посетители веб-сервера запрашивают страницы, которые по каким-то причинам на сервере не существуют: неправильная ссылка с другой страницы или с другого сайта, владелец сервера случайно удалил документ и так далее. По умолчанию Apache выдает некую довольно аскетичную страницу, на которой находится сообщение вроде «File not found». Вы можете создать альтернативную версию этой страницы, задав обработчик этой ошибки через .htaccess.

 

Пример: использование перенаправления (Redirect) на другие ресурсы или страницы

 

Синтаксис:

 

Redirect [status] URL-from URL-to

 

status - необязательное поле (используются в основном поисковыми роботами), определяет код возврата

3xx: Redirection (Перенаправление):

 

 

URL-from - URL или путь (как прямой так и относительный, корректнее будет указывать относительный путь) запрашиваемого документа (документ или страница или запрос к которому обращается посетитель сайта)

 

URL-to - URL куда будет перенаправлен запрос после обращения к URL-from

 

Например, хотим что бы, при обращении к любой страницы сайта, посетители узнали, в будущем, любимый ресурс. Допустим, что данное перенаправление временное и планируем использовать доменное имя в своих целях (Временное перенаправление).

 

Для этого создадим файл .htaccess, со следующим содержанием:

 

Redirect 307 / http://freebsd.org/

 

Допустим, делаем переадресацию на перемещённый контент, при обращении к doc/index.html или index.html. Где doc - папка сайта которая находится в той же директории, что и сам файл .htaccess. Сам контент допустим перенесли на сайт microsoft

 

Redirect 301 doc/index.html http://www.microsoft.com/rus/windows/default.mspx #Или такой вариант Redirect 301 index.html http://www.microsoft.com/rus/windows/default.mspx

 

Допустим, если не планируте развивать ресурс и закрываете его, но у него еще остались постоянные посетители и вам не хочется просто терять их, то можно со старого доменного имени перенаправить их на другой адрес.

 

Redirect 303 http://www.microsoft.com/ http://www.freebsd.org/

 

Чуть более сложный пример. Нам необходимо перенаправить всех посетителей пришедших на наш сайт без преффикса www, т.е. на host-food.ru. Ввиду массовой интернет-безграмотности, многие делают наоборот, но по уму, сайт должен находиться на субдомене www. Итак, перенаправляем всех кто пришёл по имени host-food.ru на правильное - www.host-food.ru:

 

# add www to domain name RewriteCond %{HTTP_HOST} ^host-food\.ru RewriteRule ^(.*)$ https://www.host-food.ru/$1 [R=permanent,L]

 

Также, перенаправляем с неправильно набранного имени сайта hostfood.ru на правильное - www.host-food.ru:

 

# redirect for hostfood.ru RewriteCond %{HTTP_HOST} ^hostfood\.ru RewriteRule ^(.*)$ https://www.host-food.ru/$1 [R=permanent,L] RewriteCond %{HTTP_HOST} www\.hostfood\.ru RewriteRule ^(.*)$ https://www.host-food.ru/$1 [R=permanent,L]

 

Пример: запрет доступа к некоторым файлам

 

Иногда возникает необходимость запретить доступ к определенным файлам. Например, к конфигурационным файлам, содержащим реквизиты доступа к базам данных, интерфейсам и т.п. Допустим, в файле config.cfg вы храните логин/пароль доступа к базе данных. Создаем в этой директории файл .htaccess с директивами:

 

<FilesMatch "\.(cfg)$">
Order allow,deny
Deny from all
</FilesMatch>

 

Теперь, если посетитель наберет в браузере нечто вида http://www.ваш_домен.ru//config.cfg, он получит ошибку 403.

 

Пример: переопределение индексного файла

 

Ситуация: пользователь обратился к каталогу http://www.ваш_домен.ru/price/. При таком запросе первым откроется и будет показан индексный файл. Если вы хотите переопределить индексный файл и сделать так, чтобы первым открывался не index.htm, а, например, файл myindex.php, то сделать это можно поместив в файл .htaccess, в соответствующем каталоге, следующую инструкцию:

 

DirectoryIndex myindex.php

 

Получив .htaccess с таким содержимым, веб-сервер Apache откроет, по-умолчанию, именно файл myindex.php.

 

Пример: Запрет доступа с какого-то определённого IP адреса

 

Для этого, нужно прописать в данный файл строку:

 

Deny from 77.41.104.180

 

(пример для запрета с адреса 77.41.104.180)

 

Для обратной ситуации, когда доступ надо разрешить только с одного/нескольких IP адресов, а остальным запретить, надо использовать такие строки:

 

Order Deny,Allow Allow from 77.41.104.180 Deny from all

 

Пример: Переадресация с HTTP на HTTPS

 

Ситуация: требуется перенаправить всех посетителей сайта на зищищённое HTTPS соединение

 

Создайте или добавьте в содержимое .htaccess в корне сайта следующие параметры:

 

# RewriteEngine on RewriteCond %{HTTP:X-Forwarded-Proto} !=https RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

 

Требуется запретить доступ к сайту для всех стран кроме России, и, определённой подсети

 

Создайте или добавьте в содержимое .htaccess в корне сайта следующие параметры:

# written by lissyara, 2013-05-27 in 20:53 MSK <IfModule mod_geoip.c> # включаем реврайт RewriteEngine on # включаем GeoIP GeoIPEnable On # задаём страны и поведение для них SetEnvIf GEOIP_COUNTRY_CODE BY GoodCountry SetEnvIf GEOIP_COUNTRY_CODE RU GoodCountry Order Allow,Deny # разрешаем доступ из сетей страны GoodCountry Allow from env=GoodCountry # добавляем исключение Allow from 91.227.16.0/24 </IfModule>

По поводу примера с исключением - на самом деле, эта подсеть тоже Российская, но - GeoIP на момент написания скрипта этого не знал, и не выдавал для неё страну.

 

Вот пример с блокировкой доступа к админке WordPress, и ограничением POST запросов к сайту только Россией:

 

# written by lissyara, 2015-11-04 in 12:33 MSK <IfModule mod_geoip.c> # включаем реврайт RewriteEngine on # включаем GeoIP GeoIPEnable On # задаём страны и поведение для них SetEnvIf GEOIP_COUNTRY_CODE RU GoodCountry # закрываем доступ к админке WordPress для всех не-Российских IP адресов <Files wp-login.php> Order Allow,Deny Allow from env=GoodCountry </Files> # запрещаем POST запросы ко всему сайту для всех не-Российских IP адресов <Limit POST> Order Allow,Deny Allow from env=GoodCountry </Limit> </IfModule>

 

POST запросы не кэшируются, поэтому от них создаётся большая нагрузка на сайт

 

Запрет всех POST запросов к какой-то директории

 

Создаём файл .htaccess в директории куда надо ограничить доступ:

 

# written by lissyara, 2017-01-015 in 17:23 MSK # <Limit POST> Order deny,allow Deny from all Allow from 127.0.0.1 </Limit>

 

На всех тарифах нашего хостинга поддерживается htaccess.