Как рестартовать Apache сервер? Применение файла .htaccess

Файл .htaccess

В самом популярном веб-сервере Apache веб-мастер может сделать практически все, что угодно. Создать собственные страницы ошибок, запретить доступ к определенным файлам и папкам, изменить обработку файлов (например, обрабатывать .html файлы как скрипты написанные на Perl) и многое другое.

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

Все это (и многое другое) можно настроить через специальный конфигурационный файл Apache - "httpd.conf".

Правда, есть одно но: этот файл глобальный для всего сервера. А что делать если хочется установить специальные настройки только для конкретной директории?

Разумеется выход есть. В файле "httpd.conf" предусмотрено задание директив только для определенной директории. Но тут есть проблема. Даже две.

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

Создатели Apache, разумеется, не могли оставить данный вопрос без решения. И решили они его, на мой взгляд, очень просто и элегантно. Встречайте - герой нашей статьи - файл ".htaccess".

Итак, вместо того, что бы каждый раз редактировать файл httpd.conf, можно поступить следующим образом. В директории, для которой хотите сменить настройки Apache по-умолчанию, создайте файл ".htaccess". Далее в этом файле поместите все настройки, которые необходимо применять для текущей директории.

Просто, как и все гениальное. Директивы из файла ".htaccess" имеют более высокий приоритет, чем определенные в глобальном конфигурационном файле httpd.conf.

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

Возможно вы уже потираете руки, предчувствуя, как вы теперь порезвитесь. Не торопитесь с выводами. Для того, что бы файл ".htaccess" заработал, администраторы веб-сервера должны явно разрешить это в файле httpd.conf. Это достигается следующей директивой:

AllowOverride <список параметров, которые разрешено менять>

Таким образом, администратор вполне может запретить вам менять, если не все, то некоторые из параметров через ".htaccess". Разрешить менять любые параметры можно вот так:

AllowOverride All

Запретить изменения параметров через ".htaccess" совсем, можно вот так:

AllowOverride None

Учтите, что приведенные выше директивы должны быть в файле "httpd.conf".

Возможности файла ".htaccess"

1. Разрешить или запретить доступ к файлам с определенного IP адреса.

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

order allow,deny

deny from all

allow from <xxx.xxx.xxx.xxx>

allow from googlebot.com

Как видите, можно указать разрешение на просмотр ресурса либо по IP адресу, либо по доменному имени. В примере файлы разрешено просматривать роботу Google, который приходит с доменного имени googlebot.com.

Возможно указание нескольких IP адресов через пробел. Также возможно указывать лишь честь IP адреса. Например, для того, что бы разрешить видеть ваш сайт всем из локальной сети, нужно написать что-то подобное: allow from 192.168

То же самое можно проделать, если вы хотите запретить кому-либо просмотр вашего сайта. Результат должен выглядеть вот так:

order deny,allow

allow from all

deny from 192.168.35.111

deny from googlebot.com

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

Запрет и разрешение доступа к файлам в директории - это прекрасно. Однако, что если необходимо закрыть доступ не ко всем, а только в определенным файлам в директории? Для этого существует директива Files, которая позволяет задать файлы к которым будут применяться вложенные директивы. Рассмотрим несколько примеров:

<Files "test.php">

  order allow,deny

  deny from all

</Files>

Данная конструкция запрещает доступ только к одному файлу: test.php

<Files "*.inc.php">

  order allow,deny

  deny from all

</Files>

А этот пример запрещает доступ к файлам с окончанием: .inc.php

В выражениях можно использовать символы: * - для любой последовательности любых символов, ? - для одного любого символа.

Так же существует директива (FilesMatch), позволяющая задавать совпадение имен файлов через регулярное выражение. Если вы не знаете, что такое регулярное выражение.

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

<FilesMatch "inc.php$">

  order allow,deny

  deny from all

</FilesMatch>

Как видите, нам уже не нужен знак * в начале (регулярные выражения по-умолчанию ищут подстроку). Но теперь мы должны явно указать на то, что имя файла должно оканчиваться на inc.php. Знак $ и служит для указания на то, что inc.php должно быть в конце строки.

Регулярные выражения - это очень мощный инструмент, позволяющий задать достаточно сложные шаблоны совпадений. Однако не стоит ими увлекаться. Их обработка требует от сервера на порядок больше вычислительных ресурсов. Поэтому, старайтесь избегать их использования.

Хочу обратить ваше внимание на одни факт. Запрещение обращения к файлу/файлам осуществляется только для протокола http. Из скриптов, которые выполняются на сервере, вы всегда может читать все "закрытые" файлы.

3. Организация перенаправления (редиректа).

При помощи файла ".htaccess" можно организовать перенаправление пользователя, если это необходимо.

Предположим, что необходимо сделать так, чтобы при доступе к файлу www.site.ru/xxx.html пользователь перенаправлялся бы на страницу www.site.ru/yyy.html. Сделать это можно так:

Redirect 301 /xxx.html http://www.site.ru/yyy.html

Цифра 301 указывает серверу, какой редирект использовать. 301 - постоянный редирект. 302 - временный. Постоянный - используется если страница была перемещена навсегда. Временный - если страница только временно недоступна (например, сайт находится в переработке).

Если необходимо перенаправить сразу список файлов, соответствующих некоторой маске, то используется вот такая конструкция:

RedirectMatch 301 /test(.*) http://www.site.ru/$1

Данная конструкция будет перенаправлять запросы к страницам, начинающимся со слова test на страницу без слова test вначале. Например, при доступе к http://www.site.ru/test_1.html пользователь будет перенаправлен на страницу http://www.site.ru/_1.html

$1 обозначает все то, что соответствует выражению в скобке (в нашем случае - это любое количество любых символов).

4. Задание кодировки страницы.

При помощи файла ".htaccess" можно задать кодировку страницы. После этого сервер сам будет сообщать браузеру о кодировке и вам не будет нужно вставлять в код страницы мета тег:

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

Задать кодировку можно так:

AddDefaultCharset windows-1251

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

5. Отображение скриптов в браузере.

Если вы хотите заставить сервер отобразить, например, perl или python скрипт в браузере вместо того, что бы выполнить его, то используйте следующую директиву:

RemoveHandler cgi-script .pl .py .php

Для скриптов на PHP данный метод будет работать, только если PHP установлен как cgi (о видах установки PHP я расскажу в одном из ближайших выпусков рассылки). Если же PHP установлен как модуль Apache (mod_php), то необходимо применить другой метод:

AddType text/html .php

6. Собственные страницы ошибок.

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

ErrorDocument <код_ошибки> /error.php

Здесь "код_ошибки" - код ошибки, в ответ на которую будет выдана данная страница. Например, для того что бы при обращении к несуществующей странице вашего сайта (ошибка 404) пользователь был переадресован на страницу 404.php нужно написать следующее:

ErrorDocument <404> /404.php

Возможности файла ".htaccess" очень обширны и даже на простое их перечисление займет объем небольшой книги. Дальнейшее изучение этого вопроса я предоставляю вам самостоятельно.