♛ FORTRESS-DESIGN

Apache: настройки веб-сервера, файл .htaccess

Несколько слов о веб-сервере Apache

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

360b / Shutterstock

Главный сайт проекта находится по адресу httpd.apache.org, а основная документация по версии 1.3.хх доступна на странице httpd.apache.org/docs/.

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

Индексный файл

Индексный файл или файл-индекс это тот файл, который открывается по умолчанию при обращении пользователя через веб к каталогу, а не к конкретному файлу. Например, ваш посетитель запросит адрес //ваш_домен/catalogue/, где catalogue — название каталога. Индексный файл это тот файл, который будет показан пользователю при обращении к каталогу без указании имени конкретного файла в нем.

По умолчанию индексными файлами являются следующие: index.html, index.htm, index.php, index.php3, index.phtml, index.shtml, default.htm или default.html. Если вы хотите чтобы первым открывался какой-то иной файл, нужно переопределить текущие значения.

Назначение и использование файла .htaccess

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

Файл .htaccess может быть размещен в корневом каталоге веб-сервера (прямо в каталоге www). В этом случае директивы из такого .htaccess действуют по всему веб-серверу. Также .htaccess может находиться и в конкретном подкаталоге сервера. Тогда директивы, которые указаны в этом файле, «перекрывают» действие директив из «основного» файла, который размещен в каталоге www или в любом каталоге более высокого уровня. То есть, действие директив из .htaccess наследуется сверху вниз, но не наоборот. Изменения, внесенные в файл, вступают в силу немедленно. Это связано с тем, что информация из .htaccess перечитывается при каждом обращении к веб-серверу Apache.

В .htaccess может быть помещено большинство из доступных директив для веб-сервера. Следует заметить, что директивы, в описании которых в поле Context отсутствует упоминание .htaccess недоступны для использования в этом файле конфигурации. На примере директивы AddType видим, что поле Context содержит упоминание о .htaccess, соответственно вы можете ее использовать:

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

Как переопределить кодировку HTML-документов

Мы хотим «объяснить» веб-серверу что все html-документы, которые размещены на сервере, нужно «отдавать» клиенту в кодировке koi8-r, а не в windows-1251, как это сервер делает по умолчанию. Для этого поместим в .htaccess строку: AddType "text/html; charset=koi8-r" .html .htm .shtml

Получив такой .htaccess, веб-сервер Apache станет выдавать клиентскому браузеру заголовок, в котором будет указано, что документ имеет кодировку koi8-r.

Если на вашем ресурсе существуют html-документы в разных кодировках, (ISO-8859-1, Windows-1250, Windows-1252, UTF-8), то вам, возможно, будет необходимо отключить принудительну выдачу заголовка с кодировкой windows-1251. Для этого в .htaccess добавляется строка: AddDefaultCharset Off

При этом соответствующая кодировка должна быть прописана на каждой html-странице в виде тега <http-equiv=»Content-type» content=»text/html; charset=windows-1251″ />

Это примеры простейшего использования возможностей конфигурирования Apache через файл .htaccess.

Как закрыть директорию паролем

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

В каталоге, к которому хотим ограничить доступ по паролю, создаем файл .htaccess с такими директивами:

AuthType Basic AuthName "Some Name" AuthUserFile /home/uXXXXX/.htpasswd require valid-user

Путь /home/uXXXXX/.htpasswd обозначает полный путь к файлу паролей на диске нашего сервера. Если, например, вы поместите файл .htpasswd (в нем будут пароли) в домашний каталог, куда вы попадаете зайдя на сервер по FTP, то путь к этому файлу будет иметь вид /home/uXXXXX/.htpasswd, где uXXXXX — наименование вашей виртуальной площадки (например, u12345).

В директиве AuthUserFile указываем абсолютный путь к файлу с логинами/паролями, который мы создадим чуть позже. Если вы создаете файл .htaccess на своем компьютере, а не сразу на сервере при помощи текстового редактора, обратите внимание на то, что .htaccess должен передаваться по FTP строго в текстовом (ASCII) режиме.

Создаем файл паролей. Файл с паролями должен содержать строки вида login:password. Пароль должен быть зашифрован с использованием алгоритма MD5. Один из способов создать такой файл — воспользоваться программой, входящей в поставку Apache — htpasswd (на нашем сервере она находится в каталоге /usr/local/bin/, полный путь — /usr/local/bin/htpasswd).

Рассмотрим как создать файл паролей в unix shell прямо на сервере. Зайдем в shell, и будем выполнять следующие команды:

* htpasswd -mbc .htpasswd user1 sNQ7j9oR2w создаем новый файл .htpasswd, в который добавляем запись для пользователя user1 с паролем, указанным в командной строке. Просьба обязательно заменить sNQ7j9oR2w на любой собственный пароль — здесь этот пароль указан только для примера
* htpasswd .htpasswd user2 добавляем в уже существующий файл .htpasswd пользователя user2, а пароль вводим вручную в ответ на соответствующий запрос программы

Если вы используете Windows и не хотите пользоваться unix shell для генерации паролей, можно загрузить Windows-версию программы htpasswd здесь и создать файл с паролями на своем компьютере, после чего загрузить его на сервер. Если у вас уже установлена Windows-версия Apache, файл htpasswd.exe можно найти в каталоге Program Files\Apache Group\Apache\bin\.

Итак, получите htpasswd.exe и используйте его для генерации паролей таким образом:

* htpasswd.exe -mc .htpasswd user1 создаем новый файл паролей htpasswd.exe, пароль и его подтверждение будут запрошены интерактивно
* htpasswd.exe -m .htpasswd user2 добавляем пользователя user2 в существующий файл паролей htpasswd.exe, запросив пароль интерактивно

После окончания заведения всех логинов файл нужно загрузить на сервер.

Как переопределить индексный файл

Ситуация: пользователь обратился к каталогу //www.ваш_домен.ru/price/. При таком запросе первым откроется и будет показан индексный файл. Если вы хотите переопределить индексный файл и сделать так, чтобы первым открывался не index.htm, а, например, файл myindex.php, то сделать это можно поместив в файл .htaccess в соответствующем каталоге следующую инструкцию: DirectoryIndex myindex.php

Получив .htaccess с таким содержимым, веб-сервер Apache откроет по умолчанию именно файл myindex.php.

Как запретить или разрешить выдачу листинга

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

Options +Indexes

Файл .htaccess необходимо создавать именно в том каталоге, в котором планируется разрешить листинг. Данная директива будет действовать также и на все подкаталоги (это достигается включенной по умолчанию в настройках виртуального хоста директивой AllowOverride All).

По умолчанию включена директива Options -Indexes, и в случае отсутствия индексной страницы вы получите HTTP ошибку 403.

Как настроить собственные страницы ошибок

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

По умолчанию Apache выдает некую довольно аскетичную страницу, на которой находится сообщение вроде «File not found». Вы можете создать альтернативную версию этой страницы, задав обработчик этой ошибки через .htaccess. Читайте об этом подробнее в разделе «Диагностика ошибок в работе сайта, обработка ошибок 403, 404,..».

Как закрыть доступ с некоторых IP-адресов

Иногда возникает необходимость запретить доступ к сайту или его части с некоторых IP-адресов.

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

172.16.16.16: Order Allow,Deny Allow from All Deny from 172.16.16.16

Теперь при попытке обратиться к сайту с IP-адреса 172.16.16.16 посетитель получит ошибку 403 или вашу страницу для этой ошибки.

Указание части адреса в виде 172.16.16 ограничит доступ из подсети 172.16.16/24.

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

Как закрыть доступ к некоторым файлам

Иногда возникает необходимость запретить доступ к определенным файлам. Например, к конфигурационным файлам, содержащим реквизиты доступа к базам данных, интерфейсам и т.п. Допустим, в файле config.cfg вы храните логин/пароль доступа к базе данных. Создаем в этой директории файл .htaccess с директивами:

<FilesMatch "\.(cfg)$"> Order allow,deny Deny from all </FilesMatch>

Теперь, если посетитель наберет в браузере нечто вида //www.ваш_домен.ru//config.cfg, он получит ошибку 403 или вашу страницу для этой ошибки.

Как настроить заголовок last-modified

В ряде случаев требуется, чтобы web-сервер выдавал HTTP-заголовок Last-Modified. К примеру, при регистрации вашего ресурса на Яндексе, возникает ошибка «Неправильные даты». Для статических документов cервер будет выдавать значение last-modified всегда. Это действительно для html-файлов.

Для SSI cервер будет выдавать значение last-modified в том случае, если прописана директива «XBitHack full» (просто пропишите эту строку в .htaccess), и для файла, к которому происходит обращение, выставлен атрибут «исполняемый» для группы. В скриптах last-modified выдается иными средствами. Например, если учесть то, что php-скрипт генерирует код динамически, то самым логичным будет в качестве last-modified отдавать текущую дату и время./>

Реализуется это следующим образом:
<? header("Last-Modified: " . gmdate("D, d M Y H:i:s"). " GMT"); ?>

Команда header должна выполняться в php-скрипте до того, как скрипт начнет выдавать html-текст в браузер пользователя.

Дополнительно можете изучить:

Как управлять кэшированием

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

Настройка параметров модуля mod_expires производится в файле .htaccess, что позволяет сделать индивидуальные настройки для каждого каталога.

В приведенном ниже примере отключено кэширование для текстовых документов, установлен период обновления для файлов с расширением gif — 3 месяца с момента изменения файла, для файлов с расширением jpeg — 1 день с момента обращения:

ExpiresActive on
ExpiresByType image/jpeg "access plus 1 day"
ExpiresByType image/gif "modification plus 3 months"
ExpiresByType text/html "now"

Примечание: При использовании Parser если вам необходимо полностью исключить заголовки от модуля Apache mod_expires, то для этого необходимо в директории с parser3.cgi создать файл .htaccess и внести в него следующую директиву:
ExpiresActive off

Как сделать переадресацию

Если у вас размещены 2 домена (не обязательно на одной площадке) domain1.tld и domain2.tld, и вам необходимо, чтобы при обращении к domain2.tld у пользователей изменялся адрес на «правильный», и сразу происходило перенаправление, тогда добавьте для домена domain2.tld переадресацию на //domain1.tld/.

Если вам необходимо, чтобы при обращении к вашему домену domain.tld происходило автоматическое перенаправление на www.domain.tld, создайте на виртуальной площадке в директории /home/uXXXX/domain.tld/www файл .htaccess (обратите внимание на то, что название файла начинается с точки) следующего содержания:

RewriteEngine on RewriteCond %{HTTP_HOST} ^domain\.tld RewriteRule ^(.*)$ //www.domain.tld/$1 [R=permanent,L] где uXXXX — имя вашей виртуальной площадки, domain.tld — имя вашего домена.

* О создании переадресаций с другими условиями, вы можете узнать из документации по web-серверу Apache.

Особенность переадресации на синонимах

Предположим, есть домен domain1.tld и синоним domain2.tld. Если запросить в браузере адрес //domain2.tld/dir/ со знаком слэша в конце, то будет отображена индексная страница из директории dir основного домена, при этом содержимое адресной строки браузера останется без изменений. Но если запросить //domain2.tld/dir без слэша в конце, то произойдёт переадресация на //domain1.tld/dir/, и содержимое адресной строки изменится соответствующим образом.

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

Если такое поведение веб-сервера вас не устраивает, добавьте в файл .htaccess следующие строки:

RewriteEngine on RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_URI} !^domain2.tld$ RewriteRule ^(.+[^/])$ //domain2.tld/$1/ [R]

О создании переадресаций с другими условиями вы можете узнать из документации по web-серверу Apache.

Мы рассмотрели настройки веб-сервера на хостинге провайдера. Но для того, чтобы создать сайт, должна быть подготовлена специальная платформа. Для этого нужно установить локальный «домашний» веб-сервер, без необходимости подключения к интернету.

Раньше веб-разработчикам приходилось на Windows-машине устанавливать сервер Apache с различными дополнениями к нему: PHP, Perl, MySQL и т.д. — в целях более удобной отладки сайтов. Но Дмитрий Котеров и группа программистов упростила жизнь многим веб-разработчикам, создав проект «Денвер».

Я уже давно использую Denwer (Джентельменский набор веб-разработчика). Он меня полностью устраивает, потому что этот набор прост в установке и не прихотлив в использовании.

Стандартный пакет Денвера включает в себя следующий пакет:

Правда, существуют альтернативы Денверу, которые, естественно, содержат необходимый набор для создания и тестирования динамический сайтов на своей машине.

XAMPP

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

7 мая 2016 я тоже познакомился с XAMPP. Все время до этого пользовался исключительно Денвером. Но когда установил XAMPP, чтобы запустить сайт на WordPress локально — сразу в него влюбился. Он реально крут. Не обошлось без проблем. Как всегда найдутся программы, которые также используют 80 порт. Да, опять этот Skype :). Но я отключил одну службу и все стало норм.


Перейти к верхней панели