Файл .htaccess в Apache

Файлы .htaccess размещаются в папках сайтов веб-сервера Apache. Они позволяют изменять настройки веб-сервера на уровне конкретных папок.

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

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

Если имеются неправильные настройки в главном конфигурационном файле Apache, то веб-сервер не запустится. Но «с помощью» .htaccess можно сделать так, что неправильные настройки будут подгружены при обращении к файлам папки — в этом случае веб-сервер продолжит работу, но для этого запроса будет выдана ошибка 500 — Сервер пока не может обработать этот запрос.

Как включить .htaccess

Включение поддержки файла .htaccess сказывается на производительность сервера даже в том случае, если фактически этот файл не используется (объяснение ниже). Поэтому по умолчанию файл .htaccess отключён в Apache.

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

<Directory "${SRVROOT}/htdocs">
    Options Indexes FollowSymLinks

    AllowOverride None

    Require all granted
</Directory>

Как видно, AllowOverride установлен на None. Вместо None можно указать All или любые комбинации ключевых слов, например:

AllowOverride FileInfo AuthConfig Limit

Для включения всех возможностей .htaccess установите так:

<Directory "${SRVROOT}/htdocs">
    Options Indexes FollowSymLinks

    AllowOverride All

    Require all granted
</Directory>

Чтобы настройки вступили в силу, перезапустите веб-сервер.

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

<Files ".ht*">
    Require all denied
</Files>

По умолчанию эта настройка уже имеется в главном конфигурационном файле Apache.

Как поменять имя файла .htaccess

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

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

AccessFileName ".config"

Какие настройки можно использовать в .htaccess

В файле .htaccess можно использовать многие (но не все) настройки, которые можно прописать в конфигурационном файле сервера. Чтобы точно узнать про конкретную директиву, можно её использовать в .htaccess или нет, нужно открыть документацию https://httpd.apache.org/docs/current/, найти интересующую директиву и посмотрите, указан ли в строке Context файл .htaccess. Если указан, значит можно использовать.

Пример:

Context:	server config, virtual host, directory, .htaccess
Override:	FileInfo

Очень часто файл .htaccess используется для настройки доступа или для установки правил RewriteRule (mod_rewrite), но в этом файле можно использовать и другие настройки.

Точно также, из-за того, что обычно для контроля доступа и RewriteRule используется .htaccess, многие упускают из виду, что эти же самые настройки можно прописать и в главном конфигурационном файле Apache. То есть при желании вы можете отказаться от использования .htaccess и перенести настройки mod_rewrite в конфигурацию веб-сервера.

Синтаксис .htaccess

У .htaccess нет особенных настроек синтаксиса — директивы записываются также, как и в конфигурационных файлах.

Если вы получили ошибку 5xx — Ошибка сервера, это означает, что имеется ошибка в синтаксисе .htaccess.

Как применяются директивы файла .htaccess

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

Пример:

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

Options +ExecCGI

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

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

Options Includes

Поскольку второй файл .htaccess в директории /www/htdocs/example1/example2, то выполнение CGI не разрешено, поскольку эффект будет иметь опция Options Includes, которая полностью перезаписывает значения настроек Options, имеющих место ранее.

Объединение файла .htaccess с главными конфигурационными файлами

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

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

<Location "/">
    Options +IncludesNoExec -ExecCGI
</Location>

Этот пример подразумевает, что вашим DocumentRoot является /www/htdocs.

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

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

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

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

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

Первая причина — это производительность. Когда AllowOverride установлена на разрешение использования файлов .htaccess, httpd будет искать файлы .htaccess в каждой папке. То есть разрешение файлов .htaccess ударяет по производительности не зависимо от того, используете вы на самом деле .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.

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

Помещение файла .htaccess с управляющими директивами в папку /www/htdocs/example эквивалентно помещению этих же директив в раздел Directory: <Directory "/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 и не получаете желаемого эффекта, может быть несколько причин из-за которых что-то пошло не так.

Чаще всего проблема в том, что AllowOverride не установлена так, чтобы учитывались ваши конфигурационные директивы. Убедитесь, что у вас не включено

AllowOverride None

Следующий тест позволит однозначно ответить на вопрос, включена ли поддержка файлов .htaccess или нет: поместите какой-нибудь мусор в файл .htaccess и перезагрузите страницу. Если не появиться ошибка сервера, то практически наверняка включено AllowOverride None.

С другой стороны, если вы получаете ошибки сервера при попытке доступа к документам, проверьте лог error (ошибок) 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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *