Spec-Zone.ru › Apache HTTP Server

Руководство по Apache HTTP Server: файлы .htaccess

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

Файлы .htaccess

Связанные модули Связанные директивы
  • core
  • mod_authn_file
  • mod_authz_groupfile
  • mod_cgi
  • mod_include
  • mod_mime
  • AccessFileName
  • AllowOverride
  • Options
  • AddHandler
  • SetHandler
  • AuthType
  • AuthName
  • AuthUserFile
  • AuthGroupFile
  • Require
По возможности не используйте файлы .htaccess, если у вас есть доступ к основному файлу конфигурации сервера httpd. Использование файлов .htaccess замедляет работу веб-сервера Apache. Любую директиву, которую можно поместить в файл .htaccess, лучше задать в блоке Directory: эффект будет таким же, но производительность — выше.

Что это такое и как их использовать

Файлы .htaccess (или «распределённые файлы конфигурации») позволяют вносить изменения в конфигурацию отдельно для каждого каталога. Файл с одной или несколькими директивами конфигурации помещается в определённый каталог документов, и эти директивы применяются к данному каталогу и всем его подкаталогам.

Примечание:

Если вы хотите назвать файл .htaccess как-нибудь иначе, можно изменить его имя с помощью директивы AccessFileName. Например, если вы предпочитаете назвать файл .config, добавьте в файл конфигурации сервера следующее:

AccessFileName ".config"

В целом файлы .htaccess используют тот же синтаксис, что и основные файлы конфигурации. Содержимое этих файлов определяется директивой AllowOverride. Эта директива задаёт категории директив, которые будут учитываться, если они обнаружены в файле .htaccess. Если директива разрешена в файле .htaccess, в её документации будет раздел Override, в котором указано, какое значение должно быть задано для AllowOverride, чтобы директива была разрешена.

Например, в документации к директиве AddDefaultCharset указано, что она разрешена в файлах .htaccess. (См. строку Context в сводке директивы.) В строке Override указано FileInfo. Следовательно, чтобы эта директива учитывалась в файлах .htaccess, необходимо задать как минимум AllowOverride FileInfo.

Пример:

Контекст: конфигурация сервера, виртуальный хост, каталог, .htaccess
Переопределение: FileInfo

Если вы не уверены, разрешена ли определённая директива в файле .htaccess, найдите её в документации и проверьте строку Context на наличие «.htaccess».

Когда следует (и не следует) использовать файлы .htaccess

В целом файлы .htaccess следует использовать только в том случае, если у вас нет доступа к основному файлу конфигурации сервера. Например, распространено заблуждение, что аутентификацию пользователей всегда нужно настраивать в файлах .htaccess. В последние годы появилось и другое заблуждение — будто директивы mod_rewrite обязательно должны находиться в файлах .htaccess. Это не так. Конфигурацию аутентификации пользователей можно поместить в основной файл конфигурации сервера — и именно так предпочтительно поступать. Аналогично, во многих отношениях директивы mod_rewrite лучше работают в основной конфигурации сервера.

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

Однако в целом по возможности следует избегать использования файлов .htaccess. Любую конфигурацию, которую можно поместить в файл .htaccess, с тем же успехом можно задать в секции <Directory> основного файла конфигурации сервера.

Есть две основные причины избегать использования файлов .htaccess.

Первая — производительность. Если параметр AllowOverride позволяет использовать файлы .htaccess, httpd будет искать файлы .htaccess в каждом каталоге. Поэтому разрешение файлов .htaccess снижает производительность, даже если вы ими вообще не пользуетесь! Кроме того, файл .htaccess загружается при каждом запросе документа.

Также обратите внимание: httpd должен искать файлы .htaccess во всех родительских каталогах, чтобы собрать полный набор применяемых директив. (См. раздел «Как применяются директивы».) Поэтому при запросе файла из каталога /www/htdocs/example httpd должен искать следующие файлы:

/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess

Таким образом, при каждом обращении к файлу в этом каталоге выполняются ещё 4 обращения к файловой системе, даже если ни одного из этих файлов не существует. (Это происходит только в том случае, если для / включены файлы .htaccess, что обычно не так.)

В случае директив RewriteRule в контексте .htaccess эти регулярные выражения приходится компилировать заново при каждом запросе к каталогу, тогда как в контексте основной конфигурации сервера они компилируются один раз и помещаются в кэш. Кроме того, сами правила сложнее, поскольку приходится учитывать ограничения, связанные с контекстом отдельного каталога и mod_rewrite. Дополнительные сведения см. в руководстве по Rewrite.

Вторая причина — безопасность. Вы разрешаете пользователям изменять конфигурацию сервера, что может привести к изменениям, которые вы не сможете контролировать. Тщательно обдумайте, хотите ли вы предоставить пользователям такие привилегии. Также учтите, что недостаточный уровень привилегий приведёт к дополнительным обращениям в службу технической поддержки. Чётко сообщите пользователям, какие именно привилегии вы им предоставили. Если точно указать, какое значение задано для AllowOverride, и дать ссылки на соответствующую документацию, это поможет избежать множества недоразумений в будущем.

Обратите внимание: файл .htaccess в каталоге /www/htdocs/example с директивой полностью эквивалентен той же директиве в секции Directory <Directory "/www/htdocs/example"> основного файла конфигурации сервера:

Файл .htaccess в /www/htdocs/example:

Содержимое файла .htaccess в /www/htdocs/example

AddType text/example ".exm"

Секция из файла httpd.conf

<Directory "/www/htdocs/example">
    AddType text/example ".exm"
</Directory>

Однако размещение этой конфигурации в файле конфигурации сервера меньше снижает производительность, поскольку конфигурация загружается один раз при запуске httpd, а не при каждом запросе файла.

Использование файлов .htaccess можно полностью отключить, задав директиве AllowOverride значение none:

AllowOverride None

Как применяются директивы

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

Пример:

В каталоге /www/htdocs/example1 находится файл .htaccess со следующим содержимым:

Options +ExecCGI

(Примечание: чтобы разрешить использование директивы «Options» в файлах .htaccess, необходимо включить параметр «AllowOverride Options».)

В каталоге /www/htdocs/example1/example2 находится файл .htaccess со следующим содержимым:

Options Includes

Из-за этого второго файла .htaccess выполнение CGI в каталоге /www/htdocs/example1/example2 запрещено: действует только Options Includes, полностью переопределяя все ранее заданные параметры.

Слияние файлов .htaccess с основными файлами конфигурации

Как объясняется в документации о секциях конфигурации, файлы .htaccess могут переопределять секции <Directory> для соответствующего каталога, но сами переопределяются другими типами секций конфигурации из основных файлов конфигурации. Это свойство можно использовать для принудительного применения определённых параметров даже при разрешающем значении AllowOverride. Например, чтобы запретить выполнение скриптов, разрешив задавать любые другие параметры в .htaccess, можно использовать:

<Directory "/www/htdocs">
    AllowOverride All
</Directory>

<Location "/">
    Options +IncludesNoExec -ExecCGI
</Location>
В этом примере предполагается, что DocumentRoot имеет значение /www/htdocs.

Пример аутентификации

Если вы перешли сразу к этому разделу, чтобы узнать, как настроить аутентификацию, важно отметить один момент. Распространено заблуждение, что для настройки аутентификации по паролю обязательно нужно использовать файлы .htaccess. Это не так. Предпочтительный способ настройки — поместить директивы аутентификации в секцию <Directory> основного файла конфигурации сервера. Файлы .htaccess следует использовать только в том случае, если у вас нет доступа к основному файлу конфигурации сервера. См. выше обсуждение случаев, когда следует и не следует использовать файлы .htaccess.

Если же вы всё-таки считаете, что вам нужен файл .htaccess, возможно, вам подойдёт следующая конфигурация.

Содержимое файла .htaccess:

AuthType Basic
AuthName "Password Required"
AuthUserFile "/www/passwords/password.file"
AuthGroupFile "/www/passwords/group.file"
Require group admins

Обратите внимание: чтобы эти директивы действовали, необходимо включить AllowOverride AuthConfig.

Более подробно об аутентификации и авторизации см. в руководстве по аутентификации.

Пример Server Side Includes

Ещё один распространённый способ использования файлов .htaccess — включить Server Side Includes для определённого каталога. Для этого в каталог, где требуется включить эту возможность, нужно поместить файл .htaccess со следующими директивами конфигурации:

Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml

Обратите внимание: чтобы эти директивы действовали, необходимо включить и AllowOverride Options, и AllowOverride FileInfo.

Более подробно о серверных включениях см. в руководстве по SSI.

Правила перезаписи в файлах .htaccess

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

# In httpd.conf
RewriteRule "^/images/(.+)\.jpg" "/images/$1.png"

# In .htaccess in root dir
RewriteRule "^images/(.+)\.jpg" "images/$1.png"

# In .htaccess in images/
RewriteRule "^(.+)\.jpg" "$1.png"

В файле .htaccess в каталоге документов начальный слеш удаляется из значения, передаваемого RewriteRule, а в подкаталоге images из него удаляется /images/. Поэтому регулярное выражение должно не учитывать и эту часть.

Дополнительные сведения об использовании mod_rewrite см. в документации mod_rewrite.

Пример CGI

Наконец, можно использовать файл .htaccess, чтобы разрешить выполнение CGI-программ в определённом каталоге. Это можно настроить следующим образом:

Options +ExecCGI
AddHandler cgi-script cgi pl

Или, если вы хотите, чтобы все файлы в указанном каталоге считались CGI-программами, используйте следующую конфигурацию:

Options +ExecCGI
SetHandler cgi-script

Обратите внимание: чтобы эти директивы действовали, необходимо включить и AllowOverride Options, и AllowOverride FileInfo.

Более подробно о программировании и настройке CGI см. в руководстве по CGI.

Устранение неполадок

Если после добавления директив конфигурации в файл .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

В этом случае в сообщении об ошибке должно быть указано, в чём именно состоит допущенная синтаксическая ошибка.

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/howto/htaccess.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API