Налаштування у файлі .htaccess

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

У файлі .htaccess можна задати багато різних параметрів і рішень. Цей файл можна використовувати для:

  • - створення авторизації та аутентифікації (тобто, обмеження доступу до файлів чи папок);
  • - встановлення перенаправлень (наприклад, з безкоштовного домену на платний);
  • - встановлення власної сторінки помилки (замість сторінки помилки спільної для всіх сайтів, розміщених на хостингу);
  • - для зміни складних, довгих URL на короткі і такі, які легко запамʼятати;
  • - контроля кешування;
  • - налаштування інших функцій.

Для того, щоб краще розібратись в .htaccess, розглянемо, наприклад, файл, який створюється за замовчуванням для Joomla:

  • Options +Indexes - якщо ввімкнена ця опція, то при зверненні до папки, в якій немає файлу index.html, буде відображено лістинг - список файлів, які знаходяться в папці. З допомогою цієї команди можна також виключити зі списку окремі файли, наприклад: IndexIgnore, .htaccess, .ftpquota, .DS_Store, robots.txt.

  • Якщо ввімкнена опція IndexIgnore, то всі файли будуть проігноровані і список файлів буде пустий.

  • Options +FollowSymlinks - ця опція дозволяє переходити за посиланнями, але якщо при її активації на сторінці ви побачите помилку, то швидше за все вона вже використовується в налаштуваннях сервера, і в даному файлі .htaccess її рекомендовано закоментувати або видалити.

  • Options -Indexes - відключає відображення лістингу при відсутності index.html.

  • RewriteEngine On - включає механізм перенаправлення в модулі mod_rewrite.

Далі йдуть налаштування безпеки:

RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule .* index.php [F]

Рядок параметрів закодований у Base64, містить тег <script> і флаг [NC] в кінці другого рядка вказує, що перевірка відбувається без врахування реєстру. Рядок параметрів запиту містить операцію встановлення змінної PHP GLOBALS через URL, а також містить операцію встановлення змінної РНР $_REQUEST через URL.

У випадку виконання однієї з цих умов виконується правило:

RewriteRule .* index.php [F]

Флаг [F] (у перекладі від "forbidden" — заборонено) у цьому правилі дає інструкцію серверу негайно відправити відповідь з кодом помилки 403. При цьому буде здійснене перенаправлення на головну сторінку сайту index.php, як вказано в команді.

Далі починається блок SEF-оптимизації.

Перший рядок встановлює змінну оточення HTTP_AUTHORIZATION переданими в запиті параметрами HTTP-авторизації.

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Далі йдуть рядки:

RewriteCond %{REQUEST_URI} !^/index\.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

Розглянемо по порядку. Перший рядок перевіряє відсутність index.php в рядку запиту:

RewriteCond %{REQUEST_URI} !^/index\.php

Наступний рядок перевіряє, чи запит вказує на існуючий файл:

RewriteCond %{REQUEST_FILENAME} !-f

Наступний рядок перевіряє, чи запит вказує на існуючу директорію:

RewriteCond %{REQUEST_FILENAME} !-d

Таким чином, правило не буде виконуватись, якщо в запиті було вказано неіснуючий файл або директорія.

Якщо вищезгадані умови виконані, спрцьовує правило в останньому рядку:

RewriteRule .* index.php [L]

Флаг [L] означає, що це останнє правило. Це правило скеровує запит до скрипту index.php . Тобто, незалежно від того, що передано в URL, якщо це не файл і не папка, буде виконаний скрипт index.php. При цьому рядок вихідного запиту буде доступний через суперглобальний масив $_SERVER.

Наприклад, запит: http:/yoursite.com/news/2015/07/01?prm1=556 фактично виконає: http:/yoursite.com/index.php, але в скрипті з $_SERVER ми можемо отримати наступне:

$_SERVER['REQUEST_URI'] --> 'news/2015/07/01?prm1=556'
$_SERVER['QUERY_STRING'] --> 'prm1=556'


Увага: на хостингу mintme.host заблоковано використання директив php_flag і php_value. Якщо вони прописані в файлі .htaccess, їх потрібно видалити або закоментувати.