В среде веб-программирования нередко используется файл .htaccess при хостинге сайтов под управлением сервера Apache. Это очень полезный файл, позволяющий определять неопределенные или переопределять определенные в httpd.conf или apache.conf опции для конкретного сайта иди директории этого сайта.
Файл действует на текущую директорию (где он лежит) и на все директории "ниже", т.е. все дочерние директории, если только в них не определен свой файл .htaccess.
В этой статье я изложу ряд наиболее часто применяемых возможностей этого файла. Конечно, здесь не все описано, многое Вы можете почерпнуть из просторов интернета, однако наиболее часто встречающиеся вопросы освещены.
Правила написанияДирективы файла указываются по одной на строку.
Все пути начинаются от корня сайта (не от корня файловой системы сервера!)
Например, если нужный файл на сервере лежит по пути /var/www/mysite.ru/mydir/file.html, то правильным будет путь /mydir/file.html
Если выполняется указание url, то указание происходит обязательно с использованием указания протокола.
Например, если идет перенаправление на сайт www.mysite.ru, то указывать необходимо http://www.mysite.ru
Коментарии - все, что находится после символа #
В выражениях можно использовать переменные окружения. Список наиболее часто используемых - ниже.
Наконец, при внесении изменений в файл - они сразу начинают действовать. Перезагружать ничего не надо.
Переменные окруженияХотя и не часто, но все-же в файле .htaccess могут использоваться переменные окружения. Некоторые из них приведены ниже (спасибо сайту htaccess.net.ru):
- QUERY_STRING (параметры запроса)
- REMOTE_ADDR (IP-адрес посетителя)
- REMOTE_HOST (имя хоста посетителя)
- REMOTE_USER (имя пользователя, если он прошел аутентификацию)
- REMOTE_METHOD (метод браузера - GET или POST)
- PATH_INFO (путь к файлу веб-страницы)
- HTTP_USER_AGENT (содержимое заголовка user-agent - тип браузера)
- HTTP_REFERER (содержимое заголовка referer)
- HTTP_COOKIE (содержимое заголовка cookie)
- HTTP_HOST (имя хоста веб-сайта)
- TIME_YEAR (год, месяц и т.д.)
- TIME_MONTH
- TIME_DAY
- TIME_HOUR
- TIME_MIN
- TIME_SEC
- TIME_WDAY
- REQUEST_URI (запрашиваемый URL)
- REQUEST_FILENAME (запрашиваемый файл)
- THE_REQUEST (полностью запрос)
Регулярные выражения в .htaccessВ этом файле можно использовать регулярные выражения. Их синтаксис приведен ниже. Спасибо сайту htaccess.net.ru
В регулярном выражении можно использовать любые печатные символы и пробел, но часть символов имеет особое значение:
- Круглые скобки () используются для выделения групп символов.
- Символ ^ обозначает начало строки.
- Символ $ обозначает конец строки.
- Символ . обозначает любой символ.
- Символ | обозначает альтернативу. Например, выражения "A|B" и "(ABC|DEF)" означают "A или B" и "ABC или DEF" соответственно.
- Символ ? ставится после символа (или группы символов), который может как присутствовать, так и отсутствовать. Например, выражению "jpe?g" подойдет и строка "jpg", и строка "jpeg". Пример выражения с группой символов: "super-(puper-)?site".
- Символ * ставится после символа (или группы символов), который может отсутствовать или присутствовать неограниченное число раз подряд. Например, выражению "jpe*g" подойдут строки "jpg", "jpeg" и "jpeeeeeeg".
- Символ + действует аналогично символу * с той лишь разницей, что предшествующий ему символ обязательно должен присутствовать хотя бы один раз. Например, выражению "jpe+g" подойдут строки "jpeg" и "jpeeeeg", но не "jpg".
- Квадратные скобки [ ] используются для перечисления допустимых символов. Например, выражение "[abc]" равносильно выражению "a|b|c", но вариант с квадратными скобками обычно является более оптимальным по быстродействию. Внутри скобок можно использовать диапазоны: например, выражение "[0-9]" равносильно выражению "[0123456789]". Если символы внутри квадратных скобок начинаются с символа ^, это означает любой символ, кроме перечисленных в скобках. Например, выражение "[^0-9]+" означает строку из любых символов, кроме цифр.
- Символ \ ставится перед спецсимволами, если они нужны в своем первозданном виде. Например, выражению "jpe\+g" соответствует только одна строка "jpe+g".
- Все, что расположено правее # - считается комментарием.
Как включитьВ Linux (LAMP) в конфигурации Apache использование файла .htaccess, как правило, уже разрешено. Во FreeBSD может потребоваться особо разрешить использование этого файла директивой AllowOverride в глобальной конфигурации или в конфигурации конкретного сайта.
AllowOverride All
Запрет на чтение всех файлов в директории
deny from all
Доступ с определенного IP адреса
oder deny,allow
deny from all
allow from 192.168.0.1
allow from 192.168.0.2
где вместо 192.168.0.1, 192.168.0.2 указываются IP адреса, с которых пользователям можно заходить на сайт. Иначе - ошибка 403.
Запрет на доступ с определенных IP адресов
order allow,deny
allow from all
deny from 192.168.0.1
deny from 192.168.0.2
Где вместо указанных IP необходимо указывать те, доступ с которых закрыт.
Запрет доступа к файлам по маске
<Files "\.(ext1 | ext2 | ext3)$">
order allow,deny
deny from all
</Files>
Вместо ext1, ext2, ext3... вставляем свои расширения. Правила запрета/доступа определяются так-же, как и для всей директории в целом.
Как частный случай - можно задать доступ для одного конкретного файла (правда, с учетом наследственности прав .htaccess - этот доступ или запрет распространится на все под-директории - т.е. на все файлы в этой директории и всех директориях ниже):
<Files myfile.html>
order allow,deny
deny from all
</Files>
Паролирование директорииЧасто используется при создании веб-сайтов, доступ к которым (или к части которых) разрешен не всем. При попытке открытия этого url веб-браузер запросит у пользователя логин и пароль.
AuthName "Введите пароль для доступа"
AuthType Basic
AuthUserFile /var/www/mysite.ru/.htpasswd
require valid-user
ВНИМАНИЕ! Заметьте, что здесь путь к файлу .htpasswd указывается от корня файловой системы сервера, не сайта!
Для использования данного способа следует иметь файл .htpasswd. Как его создать и пользовать - рассказано на этом же сайте в разделе веб. Приведем пример создания этого файла:
# htpasswd -c /var/www/mysite.ru/.htpasswd username password
Если ключ -c не указывать - утилита htpasswd не создаст файл заново, а добавить пользователя username к уже существующим.
Следует учесть, что при данном способе аутентификации логин и пароль передаются в открытом текстовом виде, потому рекомендуется использовать протокол HTTPS/SSL.
Как частный случай эту конструкцию можно использовать внутри блока <Files> </Files> для паролирования только некоторых файлов.
Сложное паролирование Есть структура сайта:
/mysite.ru/A
/mysite.ru/A/B1
/mysite.ru/A/B2
Необходимо сделать так, чтобы аутентификация проводилась только при доступе к директории A всех пользователей, но при этом к директории B1 имели доступ одни пользователи, а к директории B2 - другие.
Нам понадобятся файлы .htaccess в каждой директории.
.htaccess для директории A:
AuthName "Введите пароль"
AuthType Basic
AuthUserFile /var/www/mysite.ru/A/.htpasswd
<Files *.*>
require valid-user
</Files>
.htaccess для директории B1:
AuthName "Введите пароль"
AuthType Basic
AuthUserFile /var/www/mysite.ru/A/.htpasswd
<Files *.*>
require user username1 username2 username3
</Files>
.htaccess для директории B2:
AuthName "Введите пароль"
AuthType Basic
AuthUserFile /var/www/mysite.ru/A/.htpasswd
<Files *.*>
require user username1 username4 username5
</Files>
Вместо usernameX подставляем имена пользователей, которые имеют доступ к соответствующим директориям.
Перенаправление (редирект) на другой сайтСпособ 1:
Redirect / http://www.anothersite.ru
Если редирект перманентный (т.е. навсегда - что очень полезно для поисковых систем), то синтаксис будет таким:
Redirect permanent / http://www.anothersite.ru
Если вместо permanent использовать слово temp - редирект будет, наоборот, временным.
Еще пример редиректа - с конкретной директории внутри сайта:
Redirect /dir2 http://www.anothersite.ru/dir2
Способ 2:
Вместо директивы Redirect используем директиву RedirectMatch. Отличие состоит в том, что вместо указания адреса, с которого делать редирект, указывается регулярное выражение.
RedirectMatch (.*)\.gif$ http://mysite.ru/$1.png
Редиректит все обращения к .gif - на такие же по имени файлы, но с расширением .png, находящиеся по адресу mysite.ru/
Еще пример:
RedirectMatch (.*\.jpg)$ http://mysite/$1
Способ 3:
Рекомендуемый для перемещения домена для более быстрой актуализации в поисковых системах, с использованием RewriteEngine (если он разрешен на хостинге и его модуль загружен).
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.old_site\.ru$ [NC]
RewriteRule ^(.*)$ http://new_site.ru/$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^old_site\.ru$ [NC]
RewriteRule ^(.*)$ http://new_site.ru/$1 [L,R=301]
Показ разных страниц в зависимости от IP-адреса пользователя
SetEnvIf REMOTE_ADDR 192.168.0.1 REDIR="redir"
RewriteCond %{REDIR} redir
RewriteRule ^/$ /another_page.html
Вместо 192.168.0.1 вставляем свое значение.
Подмена стартовой страницы
DirectoryIndex another_file.php
По-сути, здесь мы подменяем указываемую в httpd.conf или apache.conf файле директиву DirectoryIndex.
Замещение страниц ошибок
ErrorDocument 403 /error403.html
ErrorDocument 404 /error404.html
Таким образом, при наступлении, например, ошибки 404, браузер не будет отображать свою страницу, а попытается загрузить стилизованную страницу с сайта.
Конечно, коды ошибок можно указывать и дальше - это лишь пример.
Сделать запрет отображения списка файлов в директориях без index-файла
Options -Indexes
Таким образом пользователь не сможет отобразить контент директории, где нет индексного файла (а в директории, где есть индексный файл - он не может этого сделать по-умолчанию).
Указывание отображаемой кодировкиМожно указать брайзеру - в какой кодировке ему передаются файлы. Это снизит вероятность ошибки в автоматическом определении кодировки, если файлы передаются в одной, а браузер почему-то начинает их отображать в другой.
AddDefaultCharset windows-1251
Указывание автоконвертации кодировки загружаемых файловПри загрузке на сайт файлов они будут автоматически переконвертированы в указанную кодировку.
CharsetSourceEnc koi8-r
Добавление обработчиков MIME
AddType "text/html" .myext
AddType "application/x-rar-compressed" .rar
Таким образом мы можем добавить нашему сайту директивы, не описанные в глобальном конфиге Apache.
Блокировка определенных User-Agent (веб-браузеров, ботов и роботов)Вот кусок файла .htaccess, в котором заблокированы несколько User-Agent (веб-браузеров; ботов, на самом то деле).
SetEnvIfNoCase User-Agent "^Titan" bad_bot
SetEnvIfNoCase User-Agent "^Wget" bad_bot
SetEnvIfNoCase User-Agent "^SiteSnagger" bad_bot
SetEnvIfNoCase User-Agent "^WebAuto" bad_bot
SetEnvIfNoCase User-Agent "^NetAnts" bad_bot
SetEnvIfNoCase User-Agent "^WebZip/4.0" bad_bot
SetEnvIfNoCase User-Agent "^httplib" bad_bot
<Limit get="" post="" head="">
Order Allow,Deny
Allow from all
Deny from env=bad_bot
</Limit>
Список "плохих" User-Agent здесь очень мал и приведен только как пример.
Настройки PHPПомимо переменных httpd.conf и apache.conf нам также может пригодиться изменение заданных в php.ini значений настроек php. .htaccess файл позволяет сделать и такие приятные вещи. Для этого используется директивы php_value и php_flag.
Разница между php_value и php_flag: первая директива присвает конкретное значение настройке:
php_value <config_setting> <value>
а вторая - включает или выключает boolean-настройку:
php_flag <config_setting> <on|off>
ВНИМАНИЕ! Вы не можете использовать php_admin_flag и php_admin_value в файле .htaccess!
Например, код
php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0
выключит автоматическое экранирование данных в PHP (выключит MagicQuotes), а код
php_value memory_limit 64M
переопределит значение максимального количества памяти, выделяемого для сайта.
Эти значения переопределяют определенные в php.ini файле величины или определяют их, если таковые не были установлены администратором хостинг-сервера. Весь список php-настроек здесь приводить смысле нет - его можно почерпнуть из документации к php нужной Вам версии.
Модуль Rewrite
В состав сервера Apache входит модуль Rewrite. Несмотря на то, что он используется в файле .htaccess, его мы описывать сейчас не будем, т.к. это отдельная тема, достойная отдельной статьи.
Актуально для: Apache 2.x
Это далеко не все, что можно делать с файлом .htaccess. На просторах интернета очень много специфичных примеров, здесь же собраны наиболее часто необходимые примеры.
Ответы на вопросы для самопроверки пишите в комментариях,
мы проверим, или же задавайте свой вопрос по данной теме.
Комментарии
Оставить комментарий
Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)