Файлы .htaccess предоставляют способ настройки конфигурации отображения страниц и доступа к серверу, базируясь на подкаталогах сайта.
Следует избегать широкого использования файлов .htaccess, если у Вас есть доступ к основному файлу конфигурации сервера httpd. Использование файлов .htaccess замедляет работу http-сервера Apache. Любая директива, которую Вы можете добавить в файл .htaccess, лучше установить в блок директивы Directory [2], поскольку это даст тот же эффект, с лучшей производительностью.
Файлы .htaccess (их еще называют "файлами распределенной конфигурации") содержат одну или большее количество директив конфигурации. Они помещаются в определенную директорию файлов на сервере, и директивы конфигурации применяются как к этой директории, так и ко всем её подкаталогам.
Примечание: есть возможность задавать файлам конфигурации .htaccess другие имена, если использовать директиву AccessFileName. Например, если Вы хотите содержать конфигурацию в файле .config, то можете поместить в файл конфигурации сервера следующее:
AccessFileName".config"
В общем случае файлы .htaccess используют тот же самый синтаксис, что и файлы основной конфигурации. То, что можно поместить в эти файлы, определяется директивой AllowOverride. Эта директива определяет по категориям, какие директивы будут соблюдаться, если они будут найдены в файле .htaccess. Если директива разрешена в файле .htaccess, то документация для этой директивы будет содержать секцию Override, указывающую, какое значение должно быть в AllowOverride, чтобы эта директива была разрешена.
Например, если Вы посмотрите документацию по директиве AddDefaultCharset, то обнаружите, что она разрешена в файлах .htaccess (см. строку Context в сводке директивы). Строка Override считывает FileInfo. Таким образом, должна быть как минимум одна AllowOverride FileInfo, чтобы эта директива соблюдалась в файлах .htaccess.
Указывает, где в файлах конфигурации сервера директива является законной. Это разделенный запятыми список одного или нескольких следующих значений:
server config Это означает, что директива может использоваться в файлах конфигурации сервера (например, httpd.conf), но не в любом из контейнеров < VirtualHost> или < Directory>. Это вообще запрещено в файлах .htaccess.
virtual host Этот контекст означает, что директива может отображаться в контейнерах < VirtureHost > файлов конфигурации сервера.
directory Директива, помеченная как допустимая в данном контексте, может использоваться внутри контейнеров < Directory>, < Location>, < Files>, < If> и < Proxy> в конфигурационных файлах сервера, в соответствии с ограничениями, изложенными в секциях конфигурации [3].
.htaccess Если директива допустима в этом контексте, то это значит, что она может появляться внутри файлов .htaccess, находящихся в отдельных директориях сервера. Она может не обрабатываться, однако это зависит от текущих активных переопределений.
Эта директива допустима только в пределах обозначенного контекста; если попытаться использовать её в другом месте, то произойдет ошибка конфигурации, которая либо помешает серверу правильно обрабатывать запросы в этом контексте, либо вообще помешает работе сервера - например, сервер не сможет даже запуститься.
Допустимые места для размещения директивы фактически являются результатом двоичного ИЛИ от всех перечисленных контекстов. Другими словами, директива, помещенная как допустимая в "server config, .htaccess", может использоваться в файле httpd.conf и в файлах .htaccess, но не в любом из контейнеров < Directory> или < VirtualHost>.
Этот атрибут директивы показывает, какое переопределение конфигурации должно быть активным для обработки директивы при её появлении в файле .htaccess. Если контекст директивы не разрешает ей появляться в файлах .htaccess, то контекст не будет перечислен.
Переопределения активируются директивой AllowOverride, и применяются в частной области действия (такой как директория) и всех её дочерних структурах (подкаталогах), если это не было впоследствии изменено другой директивой на более низких уровнях. Документация для этой директивы также перечисляет возможные доступные переназначения имен.
Если Вы не уверены, что определенная директива разрешена для использования в файле .htaccess, просмотрите документацию по этой директиве, и проверьте строку Context для ".htaccess".
[Когда следует (или не следует) использовать .htaccess]
Общее правило: следует использовать файлы .htaccess только тогда, когда нет доступа к основному файлу конфигурации сервера. Существует, например, распространенное заблуждение, аутентификация пользователя должна происходить в файлах .htaccess и, в более поздние годы, другое заблуждение, что директивы mod_rewrite должны выполняться в файлах .htaccess. Это просто не так. Вы можете поместить конфигурации пользователя в основной конфигурации сервера, и это по сути самый предпочтительный способ выполнения операций. Аналогично директивы mod_rewrite во многих отношениях лучше работают в основной конфигурации сервера.
Файлы .htaccess должны использоваться в случае, когда поставщики контента нуждаются в изменениях конфигурации на основе структуры каталогов сервера, но они не должны иметь доступа к корневой системе сервера. Если админ сервера не желает делать частые изменения в конфигурации, может потребоваться разрешить отдельным пользователям самостоятельно вносить эти изменения в файлы .htaccess. Это в частности верно, например, в случаях, когда провайдеры услуг интернета (Internet Service Provider, ISP) обеспечивают хостинг нескольких пользовательских сайтов на одной машине, и нужно дать возможность пользователям изменять свою индивидуальную конфигурацию.
Однако надо помнить, что следует по возможности избегать использования файлов .htaccess. Любая конфигурация, которую Вы хотите создать путем добавления файла .htaccess, может быть просто создана намного эффективнее созданием секции < Directory> в основном конфигурационном файле сервера.
Есть 2 основные причины избегать использования файлов .htaccess.
Первая причина это производительность. Когда AllowOverride устанавливается для разрешения использования файлов .htaccess, httpd будет просматривать каждый каталог на наличие в нем файла .htaccess. Таким образом, разрешение файлов .htaccess бьет по параметрам быстродействия, даже если .htaccess не используются! Также файл .htaccess загружается всякий раз, когда запрашивается документ с сайта.
Еще нужно заметить, что httpd должен искать файлы .htaccess в директориях верхнего уровня, чтобы иметь полное дополнение по директивам, которые должны быть применены (см. далее секцию "Как применяются директивы"). Таким образом, если файл был запрошен из директории /www/htdocs/example, httpd должен дополнительно просмотреть следующий список файлов:
Очевидно, что для каждого файла, который находится в подкаталоге example серверу нужно выполнить 4 операции на доступ к файловой системе, даже если ни одного из этих файлов .htaccess нет (обратите внимание, что это будет только в случае, если файлы .htaccess были разрешены для корня /, что бывает не всегда).
В случае директив RewriteRule [4], в контексте .htaccess эти регулярные выражения должны быть перекомпилированы на каждом запросе к директории, в то время как контекст основной конфигурации сервера компилируется один раз и кэшируется. Дополнительно правила сами по себе более сложные, так как необходимо обойти ограничения, накладываемые контекстом директории и mod_rewrite. Более подробно см. документацию Rewrite Guide [5].
Вторая причина проблем с .htaccess это безопасность. Пользователи могут менять конфигурацию в своих каталогах, что может привести сервер к изменениям, не зависящим от Вас как от админа. Тщательно взвесьте необходимость предоставлять пользователям привилегии на такие изменения. Также следует заметить, что уменьшение привилегий для пользователей потенциально приводит к учащению обращений в техподдержку. Убедитесь, что четко разъяснили пользователям, какой уровень привилегий Вы им предоставили. Четкое указание на до, что установлено AllowOverride, и указание на соответствующую документацию в дальнейшем избавит Вас от многих проблем и путаницы.
Обратите внимание, что существует полный эквивалент для файла .htaccess в директории /www/htdocs/example, если поместить ту же самую директиву в секцию Directory основной конфигурации сервера:
Пример файла .htaccess в каталоге /www/htdocs/example:
AddType text/example ".exm"
Секция в файле основной конфигурации сервера httpd.conf, которая делает то же самое:
Преимущество второго варианта в том, что уменьшится нагрузка на сервер, потому что конфигурация загружается один раз, и постоянно находится в быстрой оперативной памяти, тогда как конфигурация .htaccess подгружается с диска по мере необходимости.
Использование файлов .htaccess можно полностью запретить установкой директивы AllowOverride в значение none:
AllowOverrideNone
[Как применяются директивы]
Конфигурационные директивы, которые найдены в файле .htaccess, применяются к директории, где этот файл находится, а также ко всем дочерним подкаталогам. Однако следует помнить, что могут быть файлы .htaccess в директориях более высокого уровня. Таким образом, файл .htaccess в определенной директории может переназначить директивы, найденные в файле .htaccess из директории более верхнего уровня в дереве каталогов. И они, в свою очередь, могут переназначить директивы, найденные на более верхнем уровне, или в основном конфигурационном файле сервера.
Например, с директории /www/htdocs/example1 есть файл .htaccess со следующим содержимым (замечание: должна быть "AllowOverride Options", чтобы разрешить использовать директиву "Options" в файлах .htaccess):
Options +ExecCGI
В директории /www/htdocs/example1/example2 есть файл .htaccess, содержащий:
Options Includes
Из-за второго файла .htaccess в директории /www/htdocs/example1/example2, выполнение CGI не разрешено, поскольку работает только Options Includes, что полностью запрещает любые предыдущие установленные настройки.
Слияние .htaccess с основной конфигурацией. Как обсуждалось в документации по секциям конфигурации [3], файлы .htaccess могут переназначить секции < Directory> для соответствующей директории, однако будут переопределены другими типами секций конфигурации из файлов основной конфигурации. Этот факт может использоваться для принудительного применения определенных конфигураций, даже в присутствии либеральной настройки AllowOverride. Например, для предотвращения выполнения скрипта, если в .htaccess установлено что-то другое, можно использовать:
< Directory"/www/htdocs">AllowOverrideAll
< /Directory>
< Location"/">Options +IncludesNoExec -ExecCGI
< /Location>
Этот пример подразумевает, что каталог DocumentRoot соответствует /www/htdocs.
Если Вы дочитали до этого места, чтобы понять, как делать аутентификацию, то важно отметить одну вещь. Существует общее заблуждение, что для реализации аутентификации паролем нужно использовать файлы .htaccess, но дело обстоит не так. Предпочтительный способ - размещение директив аутентификации в секции < Directory> основного файла конфигурации сервера, и файлы .htaccess должны использоваться только если у Вас нет доступа к основному конфигурационному файлу сервера.
Если Вы все еще считаете, что для аутентификации нужно использовать файл .htaccess, то можете обнаружить, что показанная ниже конфигурация тоже может работать. Содержимое файла .htaccess:
AuthType Basic
AuthName"Password Required"
AuthUserFile"/www/passwords/password.file"
AuthGroupFile"/www/passwords/group.file"
Requiregroup admins
Имейте в виду, что для работы примера должна действовать AllowOverride AuthConfig. Более подробно про аутентификацию и авторизацию см. документацию [6].
Другое общее использование файлов .htaccess - разрешить Server Side Includes (SSI) для определенной директории. Это может быть сделано следующими директивами конфигурации, помещенными в файл .htaccess нужной директории:
Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml
Имейте в виду, что для работы примера должны действовать обе опции AllowOverride Options и AllowOverride FileInfo. Более подробно про SSI см. документацию [7].
Когда в файлах .htaccess используете RewriteRule, имейте в виду, что контекст директории немного меняет ситуацию. В частности, правила считаются относительно текущей директории, а не по запрашиваемому оригинальному URI. Рассмотрим следующие примеры:
# В httpd.conf
RewriteRule"^/images/(.+)\.jpg""/images/$1.png"
# В .htaccess корневой директории
RewriteRule"^images/(.+)\.jpg""images/$1.png"
# В .htaccess папки images/
RewriteRule"^(.+)\.jpg""$1.png"
В файле .htaccess директории документов, лидирующий слеш удаляется из значения, предоставляемого для RewriteRule, и в подкаталоге images удаляется /images/. Таким образом, Вашему регулярному выражению нужно также опустить эту часть. Более подробно про mod_rewrite см. соответствующую документацию [5].
Вы можете захотеть использовать .htaccess, чтобы разрешить выполнение программ CGI в определенной директории. Это может быть реализовано в следующей конфигурации:
Options +ExecCGI
AddHandler cgi-script cgi pl
Альтернативно, если Вы хотите, чтобы все файлы в определенной директории считались программами CGI, то это можно сделать следующей конфигурацией:
Options +ExecCGI
SetHandler cgi-script
Имейте в виду, что для работы примера должны действовать обе опции AllowOverride Options и AllowOverride FileInfo. Более подробно про программирование и конфигурирование CGI см. [8].
[Устранение проблем]
Если Вы помещаете директивы конфигурации в файл .htaccess и не получаете желаемый эффект, то причин может быть несколько.
Чаще всего проблема в том, что AllowOverride не установлена так, чтобы учитывались Ваши конфигурационные директивы. Проверьте, что для области действия файла нет настройки AllowOverride None. Хороший тест - поместить мусор в файл .htaccess и перезагрузить страничку. Если ошибка сервера не генерируется, то это значит, что действует настройка AllowOverride None.
С другой стороны, если Вы получаете ошибки сервера, когда пытаетесь получить доступ к документам, то просмотрите лог ошибок httpd. Это обычно даст подсказку, какая из директив в файле .htaccess не разрешена. Например:
[Fri Sep 17 18:43:16 2010] [alert] [client 192.168.200.51] /var/www/html/.htaccess:
DirectoryIndex not allowed here
Это сообщение показывает, что используется директива, не разрешенная в файлах .htaccess, или у Вас просто нет установки AllowOverride на уровень, достаточный для работы используемой директивы. Для определения конкретной причины проблемы обратитесь к документации по используемой директиве.
Альтернативно можно узнать, что при использовании самой директивы возникла синтаксическая ошибка:
[Sat Aug 09 16:22:34 2008] [alert] [client 192.168.200.51] /var/www/html/.htaccess:
RewriteCond: bad flag delimiters
В этом случае сообщение лога должно быть специфичным для определенной зафиксированной синтаксической ошибки.
[Ссылки]
1. Apache HTTP Server Tutorial: .htaccess files site:apache.org. 2. Apache Core Features < Directory> Directive site:apache.org. 3. Configuration Sections site:apache.org. 4. RewriteRule Directive site:apache.org. 5. Apache mod_rewrite Introduction site:apache.org. 6. Authentication and Authorization site:apache.org. 7. Apache httpd Tutorial: Introduction to Server Side Includes site:apache.org. 8. Apache Tutorial: Dynamic Content with CGI site:apache.org.