Топ контрибуторов
loading
loading
Знаете ли Вы, что

Вы можете подписаться на RSS ленту новых тестов сервиса Quizful, в том числе и отдельно по каждой категории

Лента обновлений
ссылка Jun 15 11:12
Комментарий от uuoweznv:
Присоединяюсь к предыдущим ораторам!
Что такое дополнит...
ссылка Jun 15 11:10
Комментарий от uuoweznv:
Считаю вопрос "Что такое программа в понимании Verilog?...
ссылка Jun 15 00:56
Комментарий от vovannna:
почему newB("AB"); скомпилируется?
ссылка Jun 14 20:01
Комментарий от Croessmah:
Не знаю, это нужно у эксперта спрашивать.
ссылка Jun 14 18:33
Комментарий от Novator_GSM:
+4
Статистика

Тестов: 153, вопросов: 8595. Пройдено: 435234 / 2135219.

Подробное руководство по .htaccess файлам

head tail Статья
категория
Веб технологии
дата17.07.2009
авторpoizon
голосов21

[Disclaimer: Данная статья была переведена в рамках "Конкурса на лучший перевод статьи" на сервисе Quizful. Ссылка на оригинал находится внизу страницы.]

Введение

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

“Дай человеку рыбу, и он съест ее за один день. Научи человека ловить рыбу и он будет есть ее на протяжении всей жизни.” - Конфуций

В данной статье мы попытаемся не только показать Вам примеры полезных .htaccess директив, но и ответить на вопрос "Как эти файлы работают?". Внимание будет уделяться Apache 2, однако большая часть может быть применена к Apache 1.3, и мы попытаемся указать на их различия.


Что такое .htaccess?

Цитата Apache:

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

Директивы

"Директивы" - понятие, которое Apache использует в командах файла конфигурации Apache. Это сравнительно короткие команды, обычно пары ключ => значение, которые меняют поведение Apache. .htaccess файл позволяет разработчикам исполнять связку директив, не имея доступа к основному файлу конфигурации сервера Apache (обычно httpd.conf). Файл httpd.conf обычно называют "основной файл конфигурации", поэтому я буду ссылаться на него по этому названию, или его короткому эквиваленту httpd.conf.

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

Отметим, что все что может быть выполнено с помощью .htaccess файла может быть выполнено в httpd.conf. Однако, не все что может быть выполнено в httpd.conf может быть выполнено в .htaccess.

Включение поддержки .htaccess

Обычно, использование .htaccess включено по умолчанию. Отношения между глобальным файлом доступа и пользовательскими файлами .htaccess контролируется директивой AllowOverride в файле httpd.conf. Она может быть размещена только внутри блока <Directory>. Значением по умолчанию является конечно "All". Таким образом использование .htaccess файлов включено по умолчанию. Альтернативным значением может быть "None", это значит что они полностью выключены. Есть множество других значений, которые ограничивают конфигурацию только определенным контекстом. Например, такие как:

  • AuthConfig - Разрешает использование директив разрешения, необходимых для защиты каталогов паролями, т.е. разрешает установку авторизации по имени пользователя и паролю (базовая аутентификация).
  • FileInfo - Разрешает использование директив, управляющих типами документа (Headers, Error Documents, Cookies, URL Rewriting и т.д.).
  • Indexes - Показывать посетителю список файлов, если в выбранном каталоге нет файла index.html или его аналога
  • Limit - Допускает использование основных директив управления доступом (allow, deny и order), директив сакционирования Limit, т.е., например, ограничивает доступ к файлам в зависимости от адреса клиентского компьютера.
  • Options - Позволяет управлять тем, какие функции сервера доступны для использования в каталоге, указанном в секции <Directory>. Может принимать значения ExecCGI, FollowSymLinks, MultiViews, Includes и другие.

Полное использование .htaccess

Я покажу несколько примеров без надлежащего блока <Directory>. В этом примере включается возможность использования .htaccess в полном объеме:

    # Даем .htaccess файлам полную силу

   AllowOverride All

Ограниченное использование .htaccess

А в данном примере, включаем только аутентификацию и индексы:

    # Здесь говорим, что .htaccess ограничен только AuthConfig Indexes

    AllowOverride AuthConfig Indexes

Комментарии

Первые строчки, выше приведенных примеров, это комментарии Apache. Комментарии начинаются с символа "#". Множество комментариев в примерах помогут Вам понять, что в них делается. Однако, они не обязательны, это сугубо индивидуально.

Вторая строчка сама директива AllowOverride. Это обычный синтаксис директив Apache. За директивой следуют пробелы, разделяющие список значений. Конечно, такой синтаксис смотрится довольно свободным. Всегда будьте осторожны.

Иногда, даже одна ошибка в файлах httpd.conf или .htaccess может привести к временной неработоспособности сервера, и пользователи будут видеть ошибку "500 - Internal Server Error pages".

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

Если Вы сомневаетесь в синтаксисе директив, то смотрите их на Apache Directive, где каждая директива включает пункт "Syntax". Я могу сделать эту статью интереснее, но всегда самой лучшей документацией является документация официальная.

Проверка включена ли поддержка .htaccess

Вполне возможно, что Ваша хостинг-компания не даст Вам доступ к httpd.conf файлу. Поэтому как Вы узнаете, включена ли поддержка .htaccess или нет? Не беспокойтесь. .htaccess это такая полезная функция, что большинство компаний включают ее, ну или включат по Вашей просьбе. Если в конфигурации Вашего хостинга не указана поддержка .htaccess, то обратитесь в технический отдел с письмом "проверить поддержку". Скорее всего у них уже подготовлен ответ на Ваш вопрос!

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

Способ 1

Этот тест очень прост. Мы используем директивы, чтобы заставить Apache искать "indexgood.html" до "index.html". Если поддержка .htaccess включена, то при заходе в папку через браузер, Apache загрузит .htaccess и узнает, что он должен показать страницу "indexgood.html" с поздравлением! Если поддержка выключена, то Apache проигнорирует .htaccess, и немедленно начнет искать файл "index.html" по умолчанию.


    # Эта директива заставит Apache искать
    # "index_good.html" перед "index.html"  
    DirectoryIndex index_good.html index.html  

DirectoryIndex

Директива DirectoryIndex получает, разделенный запятыми, список возможных файлов. Когда Apache получает URL директории (не прямой путь к файлу, например,http://www.example.com и не http://www.example.com/index.html), он будет использовать этот список файлов для поиска нужного файла. Он будет пробегать список слева направо. Если первый файл, который смотрит Apache, существует, то он загрузит и покажет его клиенту. Покажем работу выше указанного .htaccess файла для случая с поддержкой и без:

Good, Apache Redirected
Bad, htaccess Ignored

Способ 2

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

    # здесь мы намеренно допускаем ошибку
    AHHHHHHH  

Здесь "AHHHHHHH” не является директивой Apache. Это приведет к ошибке, если Apache попытается прочитать такой .htaccess файл! Поэтому, если Вы получите в ответ страницу с "Internal Server Error", говорящую о том, что сервер искал Ваш .htaccess файл, значит поддержка включена! А если Вы увидите index.html, то поддержка .htaccess отключена. Оба случая приведены ниже:

Good, Internal Service Error
Bad, htaccess Ignored

AccessFileName

И наконец, возможно, что поддержка .htaccess включена, но с уникальной настройкой. Системный администратор может изменить имя .htaccess файла, как мы поменяли имя индексного файла по умолчанию, который ищет Apache. Это возможно с помощью директивы AccessFileName в httpd.conf. Еще раз: самый лучший способ в данной ситуации, обратиться в отдел технической поддержки с просьбой предоставить более подробную информацию.

Последствия использования .htaccess файлов:

Перед тем как я покажу Вам некоторые полезные приемы, которыми Вы сможете пользоваться, я должен рассказать Вам о возможных вредоносных последствиях. Как я говорил ранее, .htaccess переопределяет настройки сервера для директорий и поддиректорий. Запомните, что изменения будут действовать не только на саму директорию, но и на ее поддиректории.

Это говорит вот о чем. Во первых, Apache ищет .htaccess файлы при каждом запросе, любые изменения будут немедленно применены. Apache не кэширует их, и Вы сможете проверить изменения при следующем запросе. Тем не менее, это значит, что Apache выполняет некоторые дополнительные действия для каждого запроса. Например, если пользователь запрашивает /www/supercool/test/index.html, то сервер проверит существование следующих .htaccess файлов:

  1. /www/.htaccess  
  2. /www/supercool/.htaccess  
  3. /www/supercool/test/.htaccess  

Это возможные файлы доступа (возможные потому, что файлы могут не существовать) и их запуск займет время. Тем не менее, если Вы не имеете доступа к httpd.conf файлу, то Вы можете всегда включать директивы в .htaccess. С настройкой AllowOverride None, Apache не будет искать .htaccess файлы и Вы можете включить настройки только непосредственно в httpd.conf:

    <Directory /www/supercool/test>  
      # Put Directives Here  
    </Directory>  


Листинг директории - Indexes:

Отображение содержимого каталога

Перед описанием группы функций, давайте начнем с чего-нибудь простого, но полезного, так Вы сможете прочувствовать работу .htaccess файлов.

Когда посетитель запрашивает ссылку на каталог (например, http://htaccess.net.ru/doc/), и такой каталог существует, Apache сперва ищет файл по умолчанию. Обычно он называется "index.html" или "index.php". Если он не находит таких файлов, то он возвращается к модулю mod_autoindex, чтобы вывести список файлов и директорий в запрашиваемой директории. Иногда это функция включена иногда нет. Точно, с помощью .htaccess Вы можете легко манипулировать листингом!

По умолчанию отображение директории включено. Ниже пример сценария. Предположим у нас есть группа медиа файлов, которые хранятся на сервере. И Вы хотите скрыть их от чужих глаз, чтобы никто не имел к ним доступа. Это легко сделать! Просто создайте файл .htaccess в директории, которую Вы хотите скрыть, и пропишите следующую директиву:

    # Это скрывает файлы от чужих глаз, если он не знает прямого пути к файлу
    # Отменяет отображение содержимого директории и поддиректорий
    Options -Indexes  

Директива Options

Эта директива может принимать несколько значений.  Если Вы снабжаете параметры символами "+" или "-", как мы делали с -Indexes, то эта опция будет наследована директориями выше и основной конфигурацией! Если Вы не указываете эти символы, то будет доступно только для данной директории и ее поддиректорий.

С такой директивой в Вашем .htaccess файле, Вы не увидите списка файлов. Посмотрим, что было до и после установки директивы:

Before, Normal Directory Listing
After, Forbidden Access

Базовая аутентификация (Basic Authentication)

Возможно, отключение листинга директорий это не то, что Вы хотите сделать. Наверно Вы хотите оставить листинг, но пускать на страницы только определенных пользователей сайта. Базовая аутентификация (Basic Authentication) может быть полезной в таком случае. Это основной тип аутентификации в интернете. Когда посетитель пытается получить доступ к странице, он видит диалоговое окно Пользователь/Пароль. Только нужные пользователи смогут получить доступ.

Для базовой аутентификации необходимы два шага:

  1. Создать файл, в котором будут храниться имя пользователя и пароль(шифрованные).
  2. Добавить в .htaccess несколько строчек для использования файла с паролями.

Обычно, файл с паролями разработчики называют ".htpasswd". Это так, потому что команда, которая генерирует шифрованную пару пользователь/пароль, называется htpasswd. Если Вы владеете этой командой, то Вам не составит труда создать новую пару. В противном случае можете воспользоваться онлайн сервисом, который просто выдаст сгенерированный текст в окно браузера.

Давайте создадим простой .htpasswd файл для пользователя "joe" с паролем "cool". Вставим эти данные в онлайн сервис и получим:

    joe:$apr1$QneYj/..$0G9cBfG2CdFGwia.AHFtR1  

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

    # включаем базовую аутентификацию
    AuthType Basic  
     
    # это сообщение будет показано в диалоговом окне.  
    AuthName "Access to the Hidden Files"  
     
    # это абсолютный путь к .htpasswd файлу. Он может быть другим.  
    AuthUserFile /path/to/.htpasswd  

    # открываем доступ всем пользователям в .htpasswd файле, кто введет правильные данные
    Require valid-user  

Эти команды хорошо документированы. Самая сложная задача, это только указание правильного пути к файлу .htpasswd, который Вы сгенерировали. Это абсолютный путь от корня сервера. Так как, путь абсолютный, то хорошо бы его размещать за пределами директории, в которой хранятся все файлы сайта. Так посетители не смогут получить к нему доступ.

Если Вы все сделали правильно, то увидите диалоговое окно аутентификации:

Login Dialog

Базовая аутентификация хороша и проста, но это не полное решение. Пароли браузер отправляет Base64 кодированными и в режиме "plain text". Если Вам хочется использовать более безопасный метод аутентификации, то используйте его в паре с https, или другим безопасным протоколом.

Заголовки (Headers)

Основной протокол в интернете это Гипертекстовый протокол передачи данных (HTTP). Если Вы действительно хотите понять, что означают директивы Apache, Вы должен иметь представление о протоколе HTTP. Здесь я только поверхностно коснусь данной темы. Далее мы рассмотрим HTTP заголовки (Headers).

С каждым запросом (от браузера) и каждым ответом (от веб сервера типа Apache) приходят две секции. Секция с заголовками и секция с самими данными, если нет больше других.

Заголовки запроса приходят от клиента к серверу. Заголовки ответа наоборот. Они генерируются самим сервером (Apache): кодировка(the content encoding), размер, mime/type, управление кэшем (Cache Control), перенаправления (Redirects), статус (Status Codes) и другие. Когда-нибудь получали ошибку 404? Это результат запроса к несуществующему файлу. Сервер возвращает код 404 (Status Code) в своем ответе.

А что можно сделать в .htaccess? Вы можете использовать директивы Apache, чтобы переписать (изменить) или добавить новые заголовки, которые будут отправлены клиенту в ответе.

Начнем с примера. Добавим заголовок в ответ и посмотрим что получится:


    # добавляем следующий заголовок в каждый ответ
    Header add X-HeaderName "Header Value"  

Запрос к файлу в той же директории, что и .htaccess файл, покажет наш заголовок:

Custom Header Shown in Safari's Web Inspector

Заметили у заголовка префикс "X-". Так разработчики обычно помечают их, чтобы указать, что они не стандартные. Эта договоренность описана здесь.

Иногда разработчики указывают смешные заголовки (This site).

Однако, я хочу показать Вам, как создавать заголовки, которые Вы сможете использовать для отладки. Как то раз, я использовал их для проверки подключения модулей на сервере. Я сделал следующую проверку:

    <IfModule mod_gzip.c>  
      Header add X-Enabled mod_gzip  
    </IfModule>  
    <IfModule mod_deflate.c>  
      Header add X-Enabled mod_deflate  
    </IfModule>  

Когда я сделал запрос с браузера, я увидел заголовки, это означало, что модули подключены!

Есть различия между Header set и Header add. С помощью "add", заголовки всегда добавятся в ответ. Даже, если они встречаются несколько раз в ответе. Вы можете использовать "set", для того, чтобы переписать заголовок по умолчанию. Например, переопределить mime/type заданный заголовком Content-Type. И тогда не будет дубликатов!


Заключение:

Я не описал несколько базовых директив Apache. Моей задачей было дать фундаментальные знания.

----------
Оригинальный текст статьи: The Ultimate Guide to .htaccess Files

Если Вам понравилась статья, проголосуйте за нее

Голосов: 21  loading...
clumsy   Faceless   googperson   googman   googler   poizon   Dimka   xuntaka   virtualny   HeavyAnykey   MikhailLyubimov   sharifulin   alvin   xam   Masya   adminhometree   Tirendil   applek   Hripunov   flash13   artyom777