Автор: Joseph Pecoraro
Введние
Дайте человеку рыбу и он будет сыт один день. Научите его ловить рыбу, и он будет сыт всегда.
Конфуций
В этой статье я попытаюсь не только показать в примерах директивы .htaccess, но и детальнее объяснить, что происходит. Таким образом, вы сможете понять базовые принципы и расширить собственные примеры или создать новые команды которые будут вам полезны.
Сфокусируемся на Apache 2, однако многое будет применимо к Apache 1.3, и я постараюсь обозначить разницу между ними.
Что такое .htaccess?
.htaccess файлы (или «распределенные файлы конфигурации) позволяют вносить конфигурационные изменения непосредственно в каждую директорию. Файл, включающий одну или более конфигурационных директив, помещается в соответствующую документу директорию. Директивы применяеются ко всей директории и поддиректориям в ней.
Директивы
«Директивы», в терминологии Apache, означают команды в конфигурационных файлах Apache. Они обычно относятся к коротким командам, представляя пары ключевых значений, которые модифицируют предписания Apache. .htaccess позволяет разработчикам выполнять группы таких команд, при этом не требуется прямой доступ к базовому файлу конфигурации Apache (httpd.conf обычно).
Эта функция идеально подходит для хостинговых компаний, осуществляющих общий (распределенный) хостинг. Компания не дает доступ своим пользователям к глобальному файлу конфигурации, который, собственно, и управляет всеми пользователями, имеющими учетные записи на этом сервере. Вместо этого подключается .htaccess, который дает возможность каждому пользователю исполнять его собственные команды в своих директориях. Как вы увидите далее, эта функция так же полезна и для разработчиков.
Следует заметить, что все то, что может быть сделано с помощью .htaccess, так же может быть сделано в httpd.conf. Тем не менее, httpd.conf имеет больший приоритет, и те возможности, которые доступны в httpd, не доступны .htaccess. Фактически, .htaccess должен быть прежде всего активирован в httpd.conf. Исполнение директив .htaccess может быть ограничено определенными «условиями» так, что они могут переписывать лишь некоторые параметры, оставлятя другие неизменными. Это дает системным администраторам более гибкий контроль надо действиями разработчиков, позволяя им работать в своих .htaccess файлах.
Активация .htaccess
.htacces, как правило, активирован по умолчанию. Он активируется командой AllowOverride в файле httpd.conf. Эта команда может быть размещена только внутри раздела . Как правило, httpd определяет DocumentRoot и в большинстве файлов директивы помещены внутрь раздела , относящиеся к определенной директории, включая AllowOverride.
Значение по умолчанию All, следовательно .htaccess файлы активированы. Если значение None, то файлы неактивны. Еще неколько значений определяют некоторые условия, ограничивающие конфигурацию.
- AuthConfig - разрешение таких команд, как выполнение проверки подлинности.
- FileInfo - команды, котрые выполняются в установках Headers, Error Documents, Cookies, URL Rewriting и другие.
- Indexes - Настройка списка основной директории.
- Limit - контроль доступа к страницам различными способами.
- Options - то же, что и Indexes, но с дополнительными значениями ExecCGI, FollowSymLinks, Includes и другими.
Полное переопределение настроек .htaccess
Пример, который позволяет полное переопределение настроек .htaccess
- # Allow .htaccess files their full power
- AllowOverride All
Ограниченное переопределение
Другой пример, который позволяет переопределять только условия Authorization и Indexes.
- # Only allow .htaccess files to override Authorization and Indexes
- AllowOverride AuthConfig Indexes
Первая строка в обоих примерах - условный комментарий Apache, который начинается с символа #. Условные комментарии типичны для всех файлов конфигурации или языков программирования. Они необязательны к применению, но очень помогают в работе.
Вторая строка - непосредственно сама команда AllowOverride. Это обычный синтаксис команд Apache. После команды следует пробел и вводится значение. Синтаксис выглядет разреженным: будьте очень внимательны
Иногда даже малюсенькая ошибка в httpd.conf или .htaccess приводит к временному отключению сервера и пользователи видят страницу с сообщением - 500 - Internal Server Error.
Уже только по этой причине всегда следует делать резервное архивирование httpd.conf и .htaccess файлов прежде, чем вы начнете вносить в них изменения. Делайте правки небольшими частями, проверяя каждое изменение на работоспособность. Если даже и будет допущена ошибка, то при таком подходе ее очень легко обнаружить.
Если вы не уверены в правильности написания команды, то обратитесь к Apache Directive listing, посмотрите таблицу «Syntax», в которой подробно описан синтаксис для каждой директивы.
Проверка активности .htaccess
Это вполне обычная вещь, потому как ваша хостинг компания не дает вам доступ к httpd.conf.. Итак, как же узнать, включен .htaccess или нет? Не стоит волноваться, потому что .htaccess общая для всех и необходимая функция, которая включена по умолчанию или будет включена, если вы попросите об этом вежливо.
Лучший способ узнать, включен .htaccess или нет - спросить об этом вашу хостинг компанию, а лучше прочтите внимательно хостинг план. Если явно нигде не указано, то стрельнИте на мэйл поддержки в крайнем случае.
Результаты применения .htaccess файла
Перед тем, как вы начнете проделывать всякие крутые штуки при помощи .htaccess, должен вам сказать, что вы получите в результате. Как уже говорилось, вам позволяется изменять настройки директори сервера и всех входящих в нее поддиректорий. Всегда помните, что внесенные изменения затрагивают все поддиректории текущей директории.
Так же, если .htaccess активен, сервер может терять в производительности. Это происходит потому, что серверные запросы сначала проходят через все .htaccess файлы в каждой поддиректории.
Это означает несколько вещей. Первое, Apache всегда просматривает .htaccess на каждом запросе, и любые изменения в этом файле вступают в силу незамедлительно. Apache не использует кэширование и сразу же заметит сделанные изменения при следующем запросе. Тем не менее, это так же означает, что сервер будет выполнять излишнюю работу при каждом запросе. К примеру, если пользователь запрашивает /www/supercool/test/index.html , то сервер будет проверять следующие .htaccess файлы:
- /www/.htaccess
- /www/supercool/.htaccess
- /www/supercool/test/.htaccess
Доступ к этим потенциальным файлам (потенциальные потому, что их может и не быть) и их исполнение (если они присутствуют) будет занимать определенное время. Опять же, мой опыт не так заметен и не может перевесить те плюсы и гибкость, которую обеспечивает .htaccess разработчикам.
Тем не менее, если вам очень нужно, то можно отключить .htaccess и вставлять команды непосредственно в .httpd.conf файл.
- <Directory /www/supercool/test>
- # Put Directives Here
- </Directory>
Недостатком такого подхода является то, что вам придеться перезагружать сервер Apache после каждого изменения.
В конце концов, все зависит от ваших личных предпочтений или от того, что позволяет ваш хостер. Использование .htaccess файла делает работу более гибкой, его можно поместить в любое место, изменения вступают в силу немедленно и сервер не требует перезагрузки.
Начнем с простого - Directory Listing - Indexes:
Directory Listing
Прежде чем заняться сложными комплексными функциями, давайте попробуем сначала чтоб-нибудь простое, но полезное, что даст почувствовать причастность к работе с .htaccess. Directory Listing настолько общая функция, что вы, вероятно, много раз с ней сталкивались, просматривая веб-сайты.
Когда пользователь обращается к директории, Apache сначала ищет основной файл, чаще всего это index.html или index.php. Если эти файлы не обнаружены, то он возвращается к mod_autoindex модулю для отображения всего списка файлов и фолдеров в директории. Иногда он включен, иногда отключен, но вы можете также настроить его под свои нужды. Итак, с помощью .htaccess мы сможем легко манипулировать этими списками.
По умолчанию Directory Listings активирован. Допустим, у вас уже есть набор медиа файлов на веб-сервере и вы хотели бы скрыть их, чтоб предотвратить воровство. Это довольно просто сделать. Создайте .htaccess файл в этой директории и впишите в него следующую директиву:
- # Disable Directory Listings in this Directory and Subdirectories
- # This will hide the files from the public unless they know direct URLs
- Options -Indexes