Web — сервер Apache — це потужний і багатофункціональний програмний продукт з різноманітними можливостями. У даній статті буде розглянуто прийоми конфігурації Apache, найбільш часто зустрічаються при розробці Web — сайтів.

Як відомо, всі налаштування сервера Apache знаходяться у файлі httpd.conf, доступ до якого є не завжди. Наприклад, якщо використовується віртуальний сервер на хостингу, коли один сервер Apache обслуговує сотні сайтів, то, природно, не можна дозволити власнику одного сайту змінювати конфігурацію сервера, яка позначиться на всіх інших сайтах. Тим не менш Web — сервер Apache допускає конфігурування на рівні окремих каталогів за допомогою файлів .htaccess. Саме на роботу з цими файлами, як єдиними конфігураційними файлами, які доступні більшості Web — розробників, і буде зроблено основний акцент в цій статті.

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

Примітка
Файл .htaccess може бути розміщений в будь-якому каталозі. Директиви цього файлу діють на всі файли у поточному каталозі та у всіх його підкаталогах (якщо ці директиви не перевизначені директивами файлів .htaccess у вкладених папках).

Зміни, що вносяться у файли .htaccess, набирають чинності негайно і не вимагають перезавантаження сервера на відміну від змін, внесених в головний конфігураційний файл httpd.conf.

Для того, щоб файли .htaccess можна було використовувати, необхідні відповідні налаштування головного конфігураційного файлу httpd.conf, де мають бути прописані директиви, які дозволять файлу .htaccess змінити конфігурацію Web-сервера в каталозі. Список цих директив задається директивою AllowOverride.

Директива AllowOverride може включати в себе одну з наступних директив або їх комбінацію: AuthConfig, FileInfo, Indexes, Limit, Options, All None

Для того щоб дати директивам файлів .htaccess максимальні права на зміни директив, значення директиви AllowOverride у файлі httpd.conf має бути одно All. Воно є значенням за замовчуванням.

AllowOverride All

Заборонити перевизначення будь-яких директив в конфігураційних файлах .htaccess можна за допомогою значення None:

AllowOverride None

Зауваження
Назва конфігураційного файлу можна змінити, наприклад, назвати його не .htaccess, a access.conf. За назву цього файлу відповідає директива AccessFileName у файлі httpd.conf. Зміна назви конфігураційного файлу .htaccess не рекомендується, оскільки це може ускладнити подальшу підтримку сервера.

Синтаксис .htaccess

Перед тим, як будуть розглянуті приклади, зупинимося на синтаксисі директив у файлах .htaccess.

  • Шляхи до файлів і каталогів повинні зазначатися від кореня сервера, наприклад, /pub/articles/masters/php/
  • При вказівці абсолютних url обов’язково повинні бути зааданы протоколи, наприклад: Redirect / http://www.site.ru
  • У файлах .htaccess неприпустимі прогалини у вказівках шляхів до файлів і в самих назвах файлів, оскільки це призводить до генерації коду відповіді 500 помилка конфігурації сервера: «Internal Server Error».

Приклади використання .htaccess

Індексні сторінки:

Можуть виникнути ситуації, коли необхідно змінити склад індексних файлів, наприклад, якщо потрібна індексна сторінка index.php, а в основному конфігураційному файлі httpd.conf вона не прописана. Цю задачу можна вирішити за допомогою файлу .htaccess, в якому необхідно створити директиву DirectoryIndex, де будуть перераховані імена індексних сторінок:

DirectoryIndex index.php index.shtml index.html

При запиті каталогу без вказівки імені файлу спочатку буде здійснено пошук сторінки з ім’ям index.php. Якщо сторінки з таким ім’ям немає в каталозі, то аналогічні операції будуть проведені з файлом index.shtml і т. д. до кінця списку, поки не буде знайдена і відкрита відповідна сторінка.

Заборона на відображення вмісту каталогу при відсутності індексного файлу

Часто потрібно заборонити відображення списку файлів в каталозі, якщо не зазначено або відсутній індексний файл. Наприклад, заборонити відображення вмісту каталогу з зображеннями. Якщо така заборона не поставити, то користувач, який звернувся безпосередньо до такого каталогу, отримає список всіх зображень.

Options –Indexes

Обробка кодів відповідей Web-сервера Apache

Жоден сайт не затрахован від виникнення помилок. Найчастішою помилкою є перехід за посиланням на неіснуючу сторінку. У цьому випадку Apache генерує код відповіді 404 і відображає автоматично згенеровану сторінку з повідомленням про помилку. Наявність неіснуючих сторінок справляє погане враження на відвідувачів сайту. Це враження можна згладити, якщо замість стандартних сторінок, підставляти власні сторінки з повідомленням про помилку. За призначення сторінок — обробників кодів відповіді протоколу HTTP несе відповідальність директива ErrorDocument

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

Після директиви ErrorDocument слід вказати код відповіді і сторінку, на яку необхідно перенаправити відвідувача при виникненні даного коду відповіді.

  • 401 помилка — Запит вимагає аутентифікації користувача (Unautorized).
  • Помилка 403 — Доступ до запитуваного ресурсу заборонений (Forbidden).
  • 404 помилка — Запитуваний документ на сервері відсутній (Not Found).
  • 500 помилка — Помилка конфігурації сервера чи зовнішньої програми (Internal Server Error).

Виконувати код PHP файлах HTML

Зазвичай PHP-код виконується в файлах з розширенням php. Іноді виникають ситуації, коли необхідно виконувати PHP-код в файлах з іншим розширенням. В цьому випадку можна дати вказівку Web-сервера виконувати PHP-код не тільки у файлах з розширенням php, але і у файлах з розширенням html.

RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml

Перший рядок видаляє обробник файли з розширенням html і htm, а друга рядок повідомляє серверу про необхідність використовувати для файлів з розширенням htm і html PHP обробник

Завдання кодування файлів на сервері

Зазначена кодування відправляється браузеру в заголовку Content-Type і дозволить браузеру клієнта автоматично переключитися на необхідну кодування.

AddDefaultCharset Windows-1251

Завдання кодування файлів, що завантажуються

При завантаженні файлів на сервер можна вказати, в якому кодуванні сервер повинен очікувати файл.

CharsetSourceEnc windows-1251

Відключення директиви MultiViews

Включена на хостингу опція MultiViews може викликати несподівані проблеми, наприклад, відображення неіснуючих сторінок сайту. Припустимо, на сайті існує сторінка з адресою http://www.sait.ru/down.phpі якщо відвідувачі звернуться до неіснуючого каталогу http://www.sait.ru/down/, то включена опція MultiViews замість цього каталогу підставить файл down.php. Однак підстановка буде виконана не повністю — шляху до зображень, таблиць стилів і т. п. будуть підставлені невірно. Тобто сторінка буде відображена з спотвореннями. Для придушення такої поведінки Apache опцію MultiViews слід відключити.

Options -MultiViews

Заборона доступу до файлів

Для того щоб відвідувачі не могли отримати доступ до службових файлів з вікна браузера, можна заборонити доступ до файлів. Для цього використовується директива заборони Deny і дозволи Allow.

Примітка
Використання директив Deny і Allow управляє тільки доступом до файлів з браузера, або з іншої програми-клієнта. Подібні заборони не поширюються на скрипти сервера.

Заборона доступу до файлів з браузера

Deny from all

При використанні такої директиви буде заборонений доступ з браузера до всіх файлів і каталогів поточного каталогу.

Заборона доступу до певного файлу

Deny from all

Тут заборонений доступ тільки до файлів за іменем config.php.

Заборона доступу до файлів розширення inc

Deny from all

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

Заборонити доступ до файлів з декількома типами розширень

Deny from all

Заборонений доступ до файлів з розширенням inc, conf і cfg

Заборонити доступ з певної IP-адреси

Deny from 195.135.232.70

Вирішити доступ тільки з певної IP-адреси

Order deny,allow
Deny from all
Allow from 195.135.232.70

Директива Order дозволяє визначити порядок, в якому будуть виконуватися директиви. Спочатку виконується директива заборони доступу(директива Deny), а потім дозволяється доступ для IP-адреси 195.135.232.70 (директива Allow). Якщо в першому рядку змінити порядок проходження директив на Order allow,deny, то доступ для IP-адреси 195.135.232.70 не буде відкрити, т. к. директива Deny, що виконується останньою, перекриє дію директиви Allow.

Примітка
Слід зазначити, що дозвіл доступу з певної IP-адреси іноді може не спрацювати. Наприклад, у тому випадку, якщо на хостингу встановлений зворотний кешуючий проксі-сервер. Якщо директиви дозволу доступу не працюють, то вам потрібно звернутися з цього питання до служби технічної підтримки хостингу.

Перенаправлення на іншу адресу

Часто зустрічаються задачі, коли всі запити до певного каталогу або сторінці потрібно перенаправити (redirect) на іншу адресу. Це можна зробити з допомогою директив Redirect і RedirectMatch. Вони повідомляють, що ресурс по запитаному url немає, і вказують адресу, за якою слід перейти. Директиви Redirect посилають браузеру відповідний заголовок, і вже браузер здійснює перенаправлення.

Глобальне переспрямування на нову адресу

Redirect / http://www.site.ru/

Перенаправлення при зверненні до певного файлу

Redirect /books/index.php http://www.site.ru/newbooks/

Перенаправлення при зверненні до будь-яких сторінках каталогу

RedirectMatch /books/.* http://www.site.ru/newbooks/

Перенаправлення при зверненні до будь-яких сторінок сайту

RedirectMatch /.* http://www.site.ru/

*Републікування статті можлива при збереженні вихідного тексту і підпису в кінці статті.