Настройка файла .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, а также содержит операцию установки PHP-переменной $_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, их нужно удалить либо закоментировать.