Spec-Zone.ru › Apache HTTP Server

Apache HTTP Server Tutorial: Файлы .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 http сервера. Любую директиву, которую можно включить в .htaccess файл, лучше задать в блоке Directory, так как это даст тот же эффект с лучшей производительностью.

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

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

Примечание:

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

AccessFileName ".config"

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

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

Пример:

Контекст: конфигурация сервера, виртуальный хост, каталог, .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. Обратитесь к Руководству по переписыванию для получения более подробной информации по этому вопросу.

Вторая причина – безопасность. Вы предоставляете пользователям возможность изменять конфигурацию сервера, что может привести к изменениям, на которые у вас нет контроля. Тщательно взвесьте, хотите ли вы предоставлять пользователям это право. Обратите также внимание, что предоставление пользователям меньших прав, чем им требуется, приведет к дополнительным обращениям в техническую поддержку. Убедитесь, что вы четко указали пользователям уровень предоставленных прав. Точное указание того, что вы установили 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

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

В каталоге /www/htdocs/example1/example2 у нас есть .htaccess файл, содержащий:

Options Includes

Из-за этого второго .htaccess файла, в каталоге /www/htdocs/example1/example2, выполнение CGI запрещено, так как действует только 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 должна быть включена для того, чтобы эти директивы имели какой-либо эффект.

См. учебник по аутентификации для более подробного обсуждения аутентификации и авторизации.

Пример включения на стороне сервера

Другое распространённое использование файлов .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