LAMP в Ubuntu: apache2.conf и .htaccess

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

Цикл статей о LAMP:

  1. LAMP в Ubuntu: базовая установка и настройка компонентов веб-сервера.
  2. LAMP в Ubuntu: apache2.conf и .htaccess
  3. LAMP в Ubuntu: виртуальные хосты.

Основной конфигурационный файл Apache в Ubuntu 16.04 и новее находится по адресу:

/etc/apache2/apache2.conf

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

Синтаксис apache.conf и .htaccess.

Сразу скажу, что синтаксис этих двух документов идентичен.
Чтобы открыть apache.conf для редактирования, воспользуйтесь командой:

sudo gedit /etc/apache2/apache2.conf

Если вам не нравится gedit, замените его любым другим текстовым редактором (например, nano). Можно обойтись без sudo, но в этом случае вы, скорее всего, сможете только просматривать содержимое файла, но не изменять его.

Внутри находится набор директив, каждая из которых отвечает за определенный параметр. Например, присутствующая на снимке LogLevel warn означает следующее: сохранять в лог все сообщения сервера, соответствующие уровню «предупреждение» и более серьезные. Слева всегда располагается название директивы, справа — ее значение. Кстати, расположение файла, в котором хранится лог ошибок, определяет директива ErrorLog.

Не лишним будет определить директиву ServerName. Стандартное значение — 127.0.0.1.

Директивы могут занимать несколько строк, в этом случае их называют блочными. Рассмотрим для примера директиву Directory:

Между символами «<» и «>» располагается название директивы, а при необходимости — еще и параметр, уточняющий ее действие. В данном случае — название каталога, к которому относится содержимое. Конец блочной директивы обозначается так же, как начало, однако перед названием ставится слеш (/). Содержимое, располагающееся между открывающим и закрывающим тегами, представляет собой такие же директивы, как те, о которых шла речь выше.

Давайте выясним, что они означают.

AllowOverride None запрещает использование файлов .htaccess в данной директории. Чтобы разрешить перезаписывать любые параметры, замените None на All. Вы также можете указать группы настроек, разрешенных к перезаписи. Например, чтобы разрешить только те директивы из .htaccess, которые меняют режим доступа, следует указать AllowOverride AuthConfig.

Require all granted разрешает доступ к директории для всех без исключений. В более ранних версиях Apache применялся другой вариант — Allow from all, имеющий то же значение.

Как запретить или ограничить доступ к директории?

Начиная с версии Apache 2.4 для регулирования доступа к директории используется директива Require. Она может располагаться как в глобальном файле настроек, так и в любом  .htaccess. Раньше те же функции выполняли Order, Allow и Deny.

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

Require all denied

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

Require not ip 123.456.789.012

подставив его ip вместо чисел.

Если убрать из этой конструкции not, доступ будет разрешен только с указанного ip. Можно также указать имя разрешенного или запрещенного хоста, указав вместо ip host.

Эти правила могут находиться внутри блочных директив <RequireAll>, <RequireAny> и <RequireNone>, которые разрешается вкладывать друг в друга для построения сложных правил доступа. Подробнее об этом читайте в документации Apache.

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

apachectl configtest

При обнаружении ошибки будут указаны сведения о ней.

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

sudo systemctl restart apache

P.S.
В следующих статьях я продолжу рассказывать о связке LAMP.
Если вы хотите прочесть о каком-то конкретном аспекте этой темы, напишите в комментариях.