Пункт 53. Файлы .htaccess
.htaccess
файлы позволяют вносить изменения в конфигурацию для каждого каталога.
файлы .htaccess
Вам следует полностью избегать использования
.htaccess
файлов, если у вас есть доступ к файлу конфигурации основного сервера httpd. Использование
.htaccess
файлов замедляет работу вашего http-сервера Apache. Любую директиву, которую вы можете включить в
.htaccess
файл, лучше установить в
Directory
блоке, так как она будет иметь тот же эффект, но с большей производительностью.
Что это такое / Как их использовать
.htaccess
файлы (или «распределенные файлы конфигурации») позволяют вносить изменения в конфигурацию для каждого каталога. Файл, содержащий одну или несколько директив конфигурации, помещается в определенный каталог документов, и директивы применяются к этому каталогу и всем его подкаталогам.
Примечание:
Если вы хотите назвать свой .htaccess
файл как-то иначе, вы можете изменить имя файла с помощью директивы AccessFileName
. Например, если вы предпочитаете вызывать файл .config
, вы можете поместить в файл конфигурации вашего сервера следующее:
ИмяФайлаДоступа ".config"
Как правило, .htaccess
файлы используют тот же синтаксис, что и основные файлы конфигурации. Что вы можете поместить в эти файлы, определяется директивой
AllowOverride
. Эта директива указывает в категориях, какие директивы будут соблюдаться, если они будут найдены в .htaccess
файле. Если директива разрешена в .htaccess
файле, документация для этой директивы будет содержать раздел Override, указывающий, какое значение должно быть, AllowOverride
чтобы эта директива была разрешена.
Например, если вы посмотрите документацию по директиве AddDefaultCharset
, вы обнаружите, что она разрешена в .htaccess
файлах. (См. строку Context в сводке директив.) Строка Override читается как
FileInfo
. Таким образом, вы должны иметь по крайней мере
AllowOverride FileInfo
, чтобы эта директива соблюдалась в .htaccess
файлах.
Пример:
Контекст: |
конфигурация сервера, виртуальный хост, каталог, .htaccess |
Переопределить: |
Информация о файле |
Если вы не уверены, разрешена ли конкретная директива в файле
.htaccess
, просмотрите документацию по этой директиве и проверьте строку Context на наличие «.htaccess».
Когда (не) использовать файлы .htaccess
Как правило, вы должны использовать .htaccess
файлы только тогда, когда у вас нет доступа к основному файлу конфигурации сервера. Существует, например, распространенное заблуждение, что аутентификация пользователей всегда должна выполняться в .htaccess
файлах, а в последнее время появилось еще одно заблуждение, что mod_rewrite
директивы должны храниться в .htaccess
файлах. Это просто не тот случай. Вы можете поместить конфигурации аутентификации пользователей в конфигурацию основного сервера, и это, по сути, предпочтительный способ работы. Точно так же mod_rewrite
директивы во многих отношениях лучше работают в конфигурации основного сервера.
.htaccess
файлы следует использовать в том случае, когда поставщикам контента необходимо внести изменения в конфигурацию сервера для каждого каталога, но они не имеют корневого доступа к серверной системе. В случае, если администратор сервера не хочет часто вносить изменения в конфигурацию, может быть желательно разрешить отдельным пользователям вносить эти изменения в .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 "/www/htdocs/example">
в конфигурации вашего основного сервера:
.htaccess
файл в /www/htdocs/example
:
Содержимое файла .htaccess в
/www/htdocs/example
AddType текст/пример ".exm"
Раздел из вашего apache2.conf
файла
<Каталог "/www/htdocs/example">
AddType текст/пример ".exm"
</Каталог>
Однако размещение этой конфигурации в файле конфигурации вашего сервера приведет к меньшему снижению производительности, поскольку конфигурация загружается один раз при запуске httpd, а не каждый раз при запросе файла.
Использование .htaccess
файлов можно полностью отключить, установив AllowOverride
директиву none
:
Аллововеррайд
Как применяются директивы
Директивы конфигурации, обнаруженные в .htaccess
файле, применяются к каталогу, в котором .htaccess
находится файл, и ко всем его подкаталогам. Однако важно также помнить, что .htaccess
в каталогах выше могли быть файлы. Директивы применяются в порядке их обнаружения. Следовательно, .htaccess
файл в определенном каталоге может переопределить директивы, найденные в .htaccess
файлах, расположенных выше в дереве каталогов. А те, в свою очередь, могут иметь переопределенные директивы, найденные еще выше, или в самом файле конфигурации основного сервера.
Пример:
В каталоге /www/htdocs/example1
у нас есть
.htaccess
файл, содержащий следующее:
Опции +ExecCGI
AllowOverride Options
(Примечание: чтобы разрешить использование директивы " Options
" в
файлах , у вас должна быть активна " " .htaccess
.)
В каталоге /www/htdocs/example1/example2
у нас есть .htaccess
файл, содержащий:
Опции Включает
Из-за этого второго .htaccess
файла в каталоге
/www/htdocs/example1/example2
выполнение CGI не разрешено, так как Options Includes
действует only, который полностью переопределяет любые более ранние настройки, которые могли быть на месте.
Объединение .htaccess с основными файлами конфигурации
Как обсуждалось в документации по разделам конфигурации,
.htaccess
файлы могут переопределять <Directory>
разделы для соответствующего каталога, но будут переопределяться другими типами разделов конфигурации из основных файлов конфигурации. Этот факт можно использовать для принудительного применения определенных конфигураций даже при наличии либеральных AllowOverride
настроек. Например, чтобы предотвратить выполнение сценария, позволяя установить что-либо еще,
.htaccess
вы можете использовать:
<Каталог "/www/htdocs">
Разрешить переопределить все
</Каталог>
<Расположение "/">
Опции +IncludesNoExec -ExecCGI
</местоположение>
В этом примере предполагается, что
DocumentRoot
ваш
/www/htdocs
.
Пример аутентификации
Если вы сразу перешли к этой части документа, чтобы узнать, как выполнить аутентификацию, важно отметить одну вещь. .htaccess
Существует распространенное заблуждение, что для реализации аутентификации по паролю необходимо использовать
файлы. Это не вариант. <Directory>
Предпочтительным способом реализации этого является размещение директив аутентификации в разделе файла конфигурации основного сервера, и .htaccess
файлы следует использовать только в том случае, если у вас нет доступа к файлу конфигурации основного сервера. См. выше обсуждение того, когда вы должны и не должны использовать .htaccess
файлы.
Сказав это, если вы все еще думаете, что вам нужно использовать
.htaccess
файл, вы можете обнаружить, что конфигурация, подобная следующей, может работать для вас.
.htaccess
содержимое файла:
Основной тип авторизации
AuthName "Требуется пароль"
AuthUserFile "/www/passwords/password.file"
AuthGroupFile "/www/passwords/group.file"
Требуются администраторы группы
Обратите внимание, что они AllowOverride AuthConfig
должны действовать, чтобы эти директивы имели какой-либо эффект.
См. руководство по аутентификации для более полного обсуждения аутентификации и авторизации.
Серверная часть включает пример
Другим распространенным использованием .htaccess
файлов является включение включений на стороне сервера для определенного каталога. Это можно сделать с помощью следующих директив конфигурации, помещенных в
.htaccess
файл в нужном каталоге:
Опции +Включает
AddType текст/html shtml
shtml, обработанный сервером AddHandler
Обратите внимание, что AllowOverride Options
и AllowOverride
FileInfo
оба должны быть в силе, чтобы эти директивы имели какой-либо эффект.
См. учебник SSI для более полного обсуждения включений на стороне сервера.
Переписать правила в файлах .htaccess
При использовании RewriteRule
в
.htaccess
файлах имейте в виду, что контекст для каждого каталога немного меняет ситуацию. В частности, считается, что правила относятся к текущему каталогу, а не к исходному запрошенному URI. Рассмотрим следующие примеры:
# В apache2.conf
Правило перезаписи "^/images/(.+)\.jpg" "/images/$1.png"
# В .htaccess в корневом каталоге
RewriteRule "^images/(.+)\.jpg" "images/$1.png"
# В .htaccess в картинках/
Правило перезаписи "^(.+)\.jpg" "$1.png"
В .htaccess
вашем каталоге документов начальный слэш удаляется из значения, переданного в RewriteRule
, а в
images
подкаталоге /images/
удаляется из него. Таким образом, ваше регулярное выражение также должно опускать эту часть.
Обратитесь к документации mod_rewrite для получения дополнительной информации об использовании mod_rewrite
.
Пример компьютерной графики
Наконец, вы можете использовать .htaccess
файл, чтобы разрешить выполнение программ CGI в определенном каталоге. Это может быть реализовано с помощью следующей конфигурации:
Опции +ExecCGI
AddHandler cgi-скрипт cgi pl
В качестве альтернативы, если вы хотите, чтобы все файлы в данном каталоге считались программами CGI, это можно сделать со следующей конфигурацией:
Опции +ExecCGI
cgi-скрипт SetHandler
Обратите внимание, что 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
В этом случае сообщение об ошибке должно относиться к конкретной синтаксической ошибке, которую вы совершили.