Htaccess если файл существует

Обновлено: 04.07.2024

Пусть это будет вспомогательный файл, перегруженный может тормозить сервер.

.htaccess

  • паролирования директорий,
  • переадресации страниц,
  • настройки собственных страниц ошибок,
  • определения кодировки,
  • запреты и разрешения,
  • и др.

Редактор

Создать файлы .htaccess можно в Блокноте или встроенном редакторе Far, WindowsCommander, TotalCommander.
Я его редактирую с Notepad++ или Akelpad, которые использую для написания этого сайта.

Кодировка

Определение кодировки на определенные типы файлов

Определение кодировки на загружаемые файлы

Отключение перекодировки

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

<FilesMatch "\.(htm|html|css|js)$">
AddDefaultCharset UTF-8
</FilesMatch>

Можно указывать несколько страниц.

DirectoryIndex index.html index.php index.shtml map.html

При запросе каталога они будут искаться в том порядке, в котором перечислены в директиве DirectoryIndex. Если не будет найден файл index.html, то будет произведен поиск файла index.php и т.д.

Разрешение/запрет

order allow deny
deny from all
allow from 000.000.000.000

запретить доступ с определенного ip.

order allow deny
allow from all
deny from 000.000.000.000

запретить просмотр всем.

разрешить просмотр всем.

Запретить доступ к определенному файлу.

<Files config.php>
deny from all
</Files>

Запретить доступ к файлам с определенным расширением.

Запретить доступ к файлам нескольких расширений.

? - любой одиночный символ
* - любая последовательность символов, исключая символ / (слеш).

Тонкая настройка доступа.

Есть каталог a1 и в нем два вложенных каталога a2, a3, введено 2 уровня пользователей. 1 группа имеет доступ только к a1 и a2, 2-я ко всем трем каталогам. Необходимо проводить аутентификацию только 1 раз - при доступе к a1, но при этом соблюдать права на доступ к а2 и а3.
Ник и пароль запрашиваются только при входе на а1 - если у юзера есть доступ на а2 пароль уже не запрашивается. Если на а3 доступа нет, вылетит табличка "введите пароль".

файл .htaccess для каталога а1:

AuthName "Input password"
AuthType Basic
AuthUserFile "/pub/home/login/htdocs/clousearea/.htpasswd"
<Files *.*>
require valid-user
</Files>

файл .htaccess для каталога а2:

AuthName "Input password"
AuthType Basic
AuthUserFile "/pub/home/login/htdocs/clousearea/.htpasswd"
<Files *.*>
require user юзер1 юзер2 юзер3
</Files *.*>

файл .htaccess для каталога а3:

AuthName "Input password"
AuthType Basic
AuthUserFile "/pub/home/абв/htdocs/clousearea/.htpasswd"
<Files *.*>
require user юзер1 юзер4 юзер5
</Files *.*>

Перенаправление (редирект)

Если вы не знаете путь от корня сервера, то Вы можете его узнать, спросив у администратора сервера, либо можете посмотреть сами, запустив на сайте функцию PHP - phpinfo() . Она выведет на экран конфигурацию PHP в виде фиолетовых таблиц. В них Вам необходимо найти переменную doc_root и посмотреть ее значение - это будет путь от корня сервера до вашей основной директории.

Перенаправление (редирект) только при запросе определенных страниц.

/location/from/root/file.ext - это путь до корневого файла (до нужного файла).

Если файл лежит в корневом каталоге, то вместо location/from/root/ можно сразу поставить:

ну и если файл в субкаталоге, то будет выглядеть так:

Редирект на папку (напр. папка oldfolder).

Перенаправление (редирект) только посетителей с определенным IP-адресом.

SetEnvIf REMOTE_ADDR 192.145.121.1 REDIR="redir"
RewriteCond % redir
RewriteRule ^/$ /only_for_you.html

Убираем WWW

Это решается следующим кодом.

Пароль

AuthName "Section Name" AuthType Basic AuthUserFile /full/path/to/.htpasswd Require valid-user

Вам надо изменить для своего сайта. Например, поменять Section Name на своё название (к примеру - Members area).

/full/path/to/.htpasswd - полный путь до файла .htapasswd (об этом чуть позже).

Если вы не знаете полного пути, то обратитесь к системному администратору.

Чтобы защитить директорию паролем, надо создать файл содержащий логины и пароли, которым разрешено будет посещать сайт. И вписать в файл .htpasswd.

Создание имен пользователей и паролей.

Вписываем имена пользователей и пароли след. образом:

пароль (password) зашифрованная версия пароля.
Чтобы зашифровать .htpasswd файл, вам нужно будет воспользоваться готовым скриптом, или самому написать его. Если вам нужно несколько пользователей, то пишите построчно их.

Как только вы заходите в защищенную паролем директорию, у вас всплывет pop-up окно для ввода логина и пароль. А можно просто вписать в поле адреса:

Ускоряем сайт с помощью gzip

Это сжатие уменьшает размер ваших файлов, и как следствие сокращает траффик у посетителя, ваш сайт быстрее открывается.

Но это подойдет только для небольших и средний сайтов, потому что вы повышаете нагрузку на сервер.

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml
application/xhtml+xml text/JavaScript text/css application/x-JavaScript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html

AddHandler server-parsed .shtml .shtm .html .htm

Чтобы пользователь не видел список файлов в папке, при отсутствии в ней индексного файла, добавим строчку:

Выполнение php кода в файлах с другим расширением.

Иногда бывает полезно "обмануть" посетителя, выдавая ему свои php-скрипты или иные файлы, как html файлы. Реально используется для индексации поисковой системой Rambler php-скриптов.

Заметьте, так как файлам с расширением .html и .htm сопоставлено, что это файлы с гипертекстовой разметкой, то мы первой строкой убираем это сопоставление и добавляем обработку таких файлов php интерпретатором.

При большой посещаемости сервера такие ухищрения могут вызвать тормоза. Спрашивайте у админа.

Если не будет файла, сообщающего об ошибке, то посетитель увидит содержимое вашего сайта, как в проводнике. Наверное, вы встречали картину подобную представленной ниже:

web-studio Ph4


Можно создать специальный файл, где будут ссылки на ваш сайт, а не на хостера. Назвать его 404.html и поместить в корневую директорию.
Величина страницы с ошибкой должна быть больше 511 байтов, иначе Internet Explorer может показать собственную страницу с описанием ошибки.

ErrorDocument 404 /404.html
ErrorDocument 403 /403.html
ErrorDocument 401 /401.html
ErrorDocument 500 /500.html

Можно указать другой файл, который автоматически откроется при появлении ошибки.
Карта сайта - является идеальным файлом для обработки ошибки error 404 (файл не найден).

ErrorDocument 404 /map.html

register_globals

Если у вас не работает почтовая форма, возможно не включен register_globals, тогда добавьте строчку:

php_flag register_globals on

Или php_flag register_globals off если вы хотите отключить.

ПРИНУДИТЕЛЬНАЯ ЗАКАЧКА ОПРЕДЕЛЕННЫХ ФАЙЛОВ

Можно некоторые файлы (MP3, EPS, XLS . ), предназначенные для скачивания принудительно скачивать, а не позволить браузеру решить, что делать. То есть, принять решение за него.
Этот фрагмент кода заставит загрузку и .xls файлы .eps с вашего сервера.

<Files *.xls>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>
<Files *.eps>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>

ЗАЩИТА ОТ ХОТЛИНКОВ

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

SetEnvIfNoCase Referer "^http://www.test.com" local_ref=1
SetEnvIfNoCase Referer "^http://test.com" local_ref=1
<FilesMatch ".(gif|jpg)>
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>

quux/.*$ [NC]
RewriteRule .*\.(gif|jpg)$ - [F]
RewriteCond % !^$
RewriteCond % !.*/foo-with-gif\.html$
RewriteRule ^inlined-in-foo\.(gif|jpg)$ - [F]

Первая строка включает обработку правил, вторая - обрезает полный путь (от корня сервера) до корня сайта.
/home/papka-s-saitom/public_html/razdel/podrazdel/ - таким был путь до RewriteBase /
/razdel/podrazdel/ - таким станет после

Благодаря «RewriteBase /» удобнее делать преобразования URI (убирается привязка к физическому расположению файлов сайта на сервере).

Давайте рассмотрим самые распространенные примеры:

1. Простой редирект

Для простого редиректа условия задавать не обязательно, только правило.

2. Реврайт без редиректа

Иногда требуется, чтобы был редирект без смены адреса, т.е. реврайт без редиректа. Для этого просто не указываем флаг редирект (R), и получаем желаемый результат, теперь по адресу news/happy получим news.html, а в адресной строке останется news/happy

3. Редирект с сохранением рейтинга страницы

Убираем у всех запросов вначале "WWW."

6. Редирект с index.php (html,htm) на главную страницу

7. Редирект с index.html на папку (удаление из строки браузера index.html)

8. Заменить все .htm файлы на .html файлы

9. Чтобы вместо page.htm загружался файл page.html

10. Переезд с одного домена на другой

11. Редирект всех файлов в папке на один файл

12. Задание типа индексной страницы (php, html, htm и другие)

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

Проверяем доменное имя, если оно начинается с www, то сработает правило: "все, на https://%1/$1". Здесь %1 это наш домен без www (взят из условия), а $1 это адрес (взят из самого правила).

13. Убираем у всех запросов в конце index.php. Переадресуем на страницу без index.php

14. Определение кодировки, в которой сервер "отдает" файлы

15. Определение кодировки на загружаемые файлы

16. Кэширование для всех типов файлов по времени доступа

17. Кэширование для всех типов файлов по времени изменения

18. Кэширование для определённых типов файлов

19. Главная страница без дублирования

20. Редирект страниц без слэша в конце URL на слеш

21. Принудительная постановка замыкающего слеша

Следующий код всегда будет добавлять слеш в адрес URL вашего сайта, что хорошо помогает в области SEO сайта.

22. Удалить слеш в конце

23. Удаляем «category» из URL

24. Редирект URL страницы с папки в корень сайта

25. Редирект от GET параметров

Например, нужно что бы со страницы /?action=page&id=15 был редирект на /page/15/

26. Редирект на мобильную версию сайта

Первой строкой мы проверяем USER_AGENT, определяем что он относится к мобильникам. (эту строку я детально не проверял, взял на просторе интернета, возможно она не совсем корректная, или есть более универсальная строка. Но на моих мобильных устройствах этот пример работает)

Второй строкой проверяем что мы находимся на нужном домене (т.к. пример не универсальный)

Третьей строкой, мы проверяем, что находимся на главной страницы (без всяких параметров и прочего) и перенаправляем на поддомен.

27. Редирект на мобильную версию сайта (Универсальная версия)

28. Обработка ошибок Apache

29. Сохранение (загрузка) файлов вместо открытия

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

31. Редирект с поддомена на основной домен второго уровня

32. Изменяем переменные php и передаём обработку другому скрипту.

В этом примере запрос вида: index.php ? parameter=some
преобразуется в: parameter.php ? some

33. Убираем переменные php из запроса

(вырезаем из URI всё, что находится после знака вопроса)

34. Заперт входа на сайт

Запрещаем вход на сайт Интернет Експлореру (вернее, кто себя так определяет) и пользователям с определённого IP-адреса (xxx.xxx.xxx.xxx).

35. Закрываем от всех

36. Закрываем конкретный файл от всех

37. Разрешаем доступ только с одного ip

38. Запрещаем доступ с конкретных ip

39. Убираем из Урла (URL) расширение файла

php можно заменить другим расширением. Например: html, htm, shtml, asp

40. При запросе файла .htaccess говорим, что он не существует (410, GONE).

41. Запрещаем отображать содержимое директории, если нет индексного файла

Вы скорее всего хоть раз видели текст Index of и список файлов. Так происходит в том случае, когда в директории нет индексного файла (например index.php), а система предлагает выбрать файл для дальнейшего открытия. Минус этого заключается в том, что случайный пользователь может увидеть список и содержание всех файлов директории.

43. Редиректы в зависимости от времени

Когда нужно применять уловки типа содержания зависящего от времени масса вебмастеров все ещё используют CGI скрипты которые производят редиректы на специальные страницы. Как это может быть сделано через mod_rewrite?

Есть много переменных названных TIME_xxx для условий редиректа. В связке со специальными лексикографическими образцами для сравнения <STRING, >STRING и =STRING мы можем производить редиректы зависящие от времени:

Это выдает содержимое foo.day.html при запросе URL foo.html с 07:00 до 19:00 а в оставшееся время содержимое foo.night.html.

44. Редирект в URL с подчеркивания в дефис

45. Редирект в URL с больших символов на маленькие

46. Массовый редирект новых файлов

Предположим вы перешли на новую систему ссылок на вашем сайте и все файлы оканчивающиеся на старый id должны быть средирекчены. Сначала создаем в базе таблицу, которая содержит старый id и новый URL для редиректа.

old_id INT new_url VARCHAR (255)

Далее пишем код который свяжет ваши старые id с новыми URL-ами
После этого, добавляем следующую строчку в .htaccess:

RewriteEngine On
RewriteBase /
Первая строка включает обработку правил, вторая — обрезает полный путь (от корня сервера) до корня сайта.
/home/papka-s-saitom/public_html/razdel/podrazdel/ — таким был путь до RewriteBase /
/razdel/podrazdel/ — таким станет после

Благодаря «RewriteBase /» удобнее делать преобразования URI (убирается привязка к физическому расположению файлов сайта на сервере).

Самые распространенные примеры:

Простой редирект

Для простого редиректа условия задавать не обязательно, только правило.

Реврайт без редиректа

Иногда требуется, чтобы был редирект без смены адреса, т.е. реврайт без редиректа. Для этого просто не указываем флаг редирект (R), и получаем желаемый результат, теперь по адресу news/happy получим news.html, а в адресной строке останется news/happy

Редирект с сохранением рейтинга страницы

Редирект с index.php (html,htm) на главную страницу

Редирект с index.html на папку (удаление из строки браузера index.html)

Заменить все .htm файлы на .html файлы

Чтобы вместо page.htm загружался файл page.html

Переезд с одного домена на другой

Редирект всех файлов в папке на один файл

Задание типа индексной страницы (php, html, htm и другие)

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

DirectoryIndex index.html index.php index.htm index.shtml

Убираем у всех запросов в конце index.php. Переадресуем на страницу без index.php

Вариант для битрикс :

Определение кодировки на загружаемые файлы

Кэширование для всех типов файлов по времени доступа

Кэширование для всех типов файлов по времени изменения

Кэширование для определённых типов файлов

Главная страница без дублирования

Редирект страниц без слэша в конце URL на слеш

Принудительная постановка замыкающего слеша

Следующий код всегда будет добавлять слеш в адрес URL вашего сайта, что хорошо помогает в области SEO сайта.

Убираем повторяющиеся слеши

Удалить слеш в конце

Удаляем «category» из URL

Редирект URL страницы с папки в корень сайта

Редирект от GET параметров

Например, нужно что бы со страницы /?action=page&id=15 был редирект на /page/15/

Редирект на мобильную версию сайта

Первой строкой мы проверяем USER_AGENT, определяем что он относится к мобильникам. (эту строку я детально не проверял, взял на просторе интернета, возможно она не совсем корректная, или есть более универсальная строка. Но на моих мобильных устройствах этот пример работает)

Второй строкой проверяем что мы находимся на нужном домене (т.к. пример не универсальный)

Третьей строкой, мы проверяем, что находимся на главной страницы (без всяких параметров и прочего) и перенаправляем на поддомен.

Редирект на мобильную версию сайта (Универсальная версия)

Обработка ошибок Apache

ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html

Сохранение (загрузка) файлов вместо открытия

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

AddType application/octet-stream .rar .doc .mov .avi .pdf .xls .mp4

Редирект с поддомена на основной домен второго уровня

Изменяем переменные php и передаём обработку другому скрипту.

В этом примере запрос вида: index.php?parameter=some
преобразуется в: parameter.php?some

Убираем переменные php из запроса

(вырезаем из URI всё, что находится после знака вопроса)

Заперт входа на сайт

Запрещаем вход на сайт Интернет Експлореру (вернее, кто себя так определяет) и пользователям с определённого IP-адреса (xxx.xxx.xxx.xxx).

Закрываем от всех

Закрываем конкретный файл от всех

Разрешаем доступ только с одного ip

order deny,allow
deny from all
allow from 192.111.37.125

Запрещаем доступ с конкретных ip

order allow,deny
allow from all
deny from 192.111.35.122
deny from 192.111.37.171

Убираем из Урла (URL) расширение файла

php можно заменить другим расширением. Например: html, htm, shtml, asp

При запросе файла .htaccess говорим, что он не существует (410, GONE).

Запрещаем отображать содержимое директории, если нет индексного файла

Вы скорее всего хоть раз видели текст Index of и список файлов. Так происходит в том случае, когда в директории нет индексного файла (например index.php), а система предлагает выбрать файл для дальнейшего открытия. Минус этого заключается в том, что случайный пользователь может увидеть список и содержание всех файлов директории.

Пример для WP htaccess:

Редиректы в зависимости от времени

Когда нужно применять уловки типа содержания зависящего от времени масса вебмастеров все ещё используют CGI скрипты которые производят редиректы на специальные страницы. Как это может быть сделано через mod_rewrite?

Есть много переменных названных TIME_xxx для условий редиректа. В связке со специальными лексикографическими образцами для сравнения <STRING, >STRING и =STRING мы можем производить редиректы зависящие от времени:

Это выдает содержимое foo.day.html при запросе URL foo.html с 07:00 до 19:00 а в оставшееся время содержимое foo.night.html.

Редирект в URL с подчеркивания в дефис

Редирект в URL с больших символов на маленькие

Массовый редирект новых файлов

Предположим вы перешли на новую систему ссылок на вашем сайте и все файлы оканчивающиеся на старый id должны быть средирекчены. Сначала создаем в базе таблицу, которая содержит старый id и новый URL для редиректа.

old_id INT new_url VARCHAR (255)

Далее пишем код который свяжет ваши старые id с новыми URL-ами
После этого, добавляем следующую строчку в .htaccess:

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

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

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

Что такое .htaccess?

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

Директивы

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

Включение поддержки .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 AuthConfig Indexes

Комментарии

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

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

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

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

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

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

Способ 1

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

DirectoryIndex

Good, Apache Redirected

Bad, htaccess Ignored

Способ 2

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

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

Good, Internal Service Error

Bad, htaccess Ignored

AccessFileName

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

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

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

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

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

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

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

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

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

Директива Options

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

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

Before, Normal Directory Listing

After, Forbidden Access

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

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

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

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

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

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

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

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

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

Login Dialog

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

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

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

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

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

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

Custom Header Shown in Safari

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

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

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

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

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

Заключение:

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

Читайте также: