Что такое .htaccess?

  Что такое Redirect?

  Перенаправление Redirect

  Синтаксис

  Директивы

  Код перенаправления

  Примеры

 

.htaccess – файл, предназначенный для создания дополнительной конфигурации (дополнительных настроек) веб-серверов типа Apache и ему подобных. Этот файл имеет огромные возможности, основной из которых является Redirect.

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

  • ограничить доступ к сайту или к отдельным его страницам определённых пользователей, включая роботов поисковых систем (не путать с файлом robots.txt, который является рекомендательным для поисковиков, а .htaccess – обязательным);
  • устанавливать соответствие определённых страниц различным браузерам;
  • устанавливать время доступа к сайту;
  • обрабатывать ошибки;
  • указывать кодировку;
  • устанавливать пароли для доступа к определённым папкам и файлам;
  • указывать опции PHP;
  • запретить скачивание определённых ресурсов (файлов) с сайта.

И это далеко не весь список огромных возможностей файла!

При работе с этим файлом обратите внимание на несколько серьёзных правил:

 Действие файла .htaccess распространяется только на каталог, в котором он расположен, и на его "дочерние" каталоги.

 На работу файла влияют настройки, установленные на сервере, а так же в браузере, поэтому некоторые директивы могут не работать или работать не корректно!

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

 После установки директив в файл .htaccess обязательно проверяйте ответ сервера (например, на сайте https://bertal.ru/ или в Вебмастере Яндекса). Что такое "ответ сервера" и как его читать смотрите в Справочниках (статья Ответы сервера).

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

В качестве примера вы можете просмотреть исходный файл .htaccess, устанавливаемый при загрузке CMS Joomla; помимо оригинального кода здесь имеется такой же код, но с русскоязычными комментариями: Файл .htaccess в CMS Joomla.

 

Перенаправление (Redirect)

Для чего это нужно?

  • для указания главного зеркала сайта, что очень важно для поисковых роботов;
  • для перенаправления с одной страницы сайта на другую в пределах одного сайта;
  • для перенаправления со страницы одного сайта на такую же или главную страницу другого;
  • для перенаправления с www на адрес без www и наоборот;
  • для установки запрета доступа к определённым страницам и файлам;
  • для установки запрета скачивания определённых ресурсов и файлов;
  • для установки времени работы сайта (когда он открыт для пользователей);
  • для блокировки определённых пользователей, в т.ч. и роботов поисковых систем.

И  для много чего ещё…

Синтаксис

Метасимволы

# Означает начало комментария; всё, что расположено в строке после символа не обрабатывается и не учитывается.
^  Указывает, что сравнение текста УСЛОВИЯ или ШАБЛОНА должно производиться от начала строки текущего URL. Более подробно действие этого метасимвола будет разобрано ниже в примере № 2.
$ Означает, что при сравнении текста УСЛОВИЯ или ШАБЛОНА строка текущего URL должна заканчиваться именно так. Более подробно действие этого метасимвола будет разобрано ниже в примере № 2.
\ Указывает, что следующий за ним символ - обычный и не является метасимволом.
. Обозначает любой символ.
| Означает альтернативный вариант, т.е. может использоваться либо значение слева от |, либо справа.
[ ] Указывают, что перечисленные в скобках символы допустимы.
[^] Указывают, что перечисленные символы недопустимы (недоступны).
( ) Группирует символы и создаёт из них переменную вида $n или %n, где n – от 1 до 9.

 

Переменные обратной связи

Значения, записанные из скобок ( ) в переменную, называются обратной связью. Таких переменных может быть девять или десять (значение n):

$n  Переменная, в которую записываются данные из сгруппированных в скобках ( ) частей шаблона в директиве RewriteRule; n может быть от 0 до 9.
%n Переменная, в которую записываются данные из сгруппированных в скобках ( ) частей условия в директиве RewriteCond; n может быть от 1 до 9. 

 

Квантификаторы

? Ставится после символа или группы символов, наличие которых не обязательно: они могут присутствовать или отсутствовать.
* Означает, что символ может отсутствовать или иметь много повторов.
+ Означает, что символ может иметь много повторов или применяться хотя бы 1 раз.

 

Флаги

Указывают специальные опции (в квадратных скобках, разделяются запятой):

[L]  Указывает на окончание процесса, при этом текущая ссылка считается окончательной.
[NC] Отключает проверку регистра символов, делает шаблон нечувствительным к регистру.
[F] Делает указанный URL запрещённым, выдаётся ответ с кодом 403 ("Запрещено").
[G] Выдаёт ответ с кодом 410 ("Ресурс недоступен"). Применяется для окончательно удалённых с сайта страниц, которые ещё могут оставаться в поиске.
[P] Устанавливает подстановку как внутренний запрос прокси и пропускает его через прокси-модуль.
[N] Перезапускает цикл преобразования сначала.
[QSA] Указывает на то, что адрес должен быть не заменён, а дополнен; используется для добавления данных в строку запроса.
[OR] Используется в значении "или" при применении нескольких RewriteCond (см. ниже Пример № 3).
[R]

Указывает на окончание процесса и возвращает результат как Redirect; здесь через знак "=" может быть указан один из кодов:

  • 301 – Redirect установлен окончательно и навсегда, поэтому роботы поисковых систем этот ресурс не индексируют, но обязательно проиндексируют ресурс, на который перенаправляет Redirect;
  • 302 – Redirect установлен временно, индексация происходит так же, как и при 301;
  • 304 – указывает, что страница (ресурс) не изменялся со времени последнего посещения роботом, что ускоряет индексирование и снижает трафик;
  • 305 – указывает, что доступ к данному ресурсу осуществляется только через прокси-сервер;
  • 307 – указывает, что ресурс временно переведён на другой адрес, но в отличии от кода 302, этот адрес нужно прописать в Location. Что такое "Location" и как его читать смотрите в Справочниках (статья Коды ответов сервера).

 

Переменные, которые могут применяться в выражении %{ПЕРЕМЕННАЯ}

AUTH_TYPE   Идентификация пользователя
DOCUMENT_ROOT  Путь к корневой директории (сервера)
HTTP_ACCEPT  Предпочтение клиента относительно типа документа
HTTP_COOKIE  Содержит Cookie, которые передаёт браузер
HTTP_FORWARDED  IP-адрес прокси-сервера
 HTTP_HOST  Адрес сервера (домена)
 HTTP_REFERER Адрес страницы, с которой пользователь зашёл на заданную страницу, например, с поисковика
 HTTP_USER_AGENT  Инфо о пользователе: тип и версия браузера, тип операционной системы
IS_SUBREQ   Выдаёт «true», если запрос выполняется как подзапрос, в другом случае выдаёт «false»
 PATH_INFO    Содержит данные, передаваемые в скрипт
QUERY_STRING   Строка, переданная как запрос при вызове скрипта CGI
REMOTE_ADDR   IP-адрес пользователя
REMOTE_HOST   Адрес посетителя, передаваемый как host
REMOTE_IDENT   Идентификатор (имя) удалённого пользователя, передаваемое как id.host, где host – адрес посетителя
REMOTE_USER   Передаёт идентификатор (имя) удалённого пользователя
REQUEST_FILENAME   Указывает полный путь на сервере к файлу, соответствующему запросу.
REQUEST_METHOD   Определение типа запроса
REQUEST_URI   Страница, запрашиваемая в строке запроса без указания домена
 SCRIPT_FILENAME  Указывает полный путь на сервере к скрипту, соответствующему запросу.
 SERVER_ADDR  IP-адрес вашего сайта
 SERVER_ADMIN  Адрес почты, указанный в панели управления сайтом для связи с суперадминистратором (владельцем сайта)
 SERVER_NAME   Адрес сервера
 SERVER_PORT  Порт, используемый Apache.
 SERVER_PROTOCOL  Версия протокола HTTP
 SERVER_SOFTWARE  Название сервера
THE_REQUEST   Полная строка запроса, отправленная браузером

TIME (TIME_DAY,

TIME_HOUR, TIME_MIN,

TIME_MON, TIME_SEC,

TIME_WDAY,

TIME_YEAR

 
  Переменные для работы со временем

 

Директивы

Options +FollowSymlinks
Разрешает переход по символическим ссылкам. Без этой директивы модуль перенаправления работать не будет! Так же стоит иметь в виду, что данная директива может быть запрещена на уровне хостинга, поэтому перенаправление, прописанное в файле, работать не будет.

RewriteEngine On
Указывает, что механизм преобразования включен. Если указано значение "off", то механизм выключен; стоит иметь ввиду, что по умолчанию стоит значение "off", поэтому все действия в перенаправлениями не забывайте начинать с включения механизма.

RewriteBase
Указывает на то, что модуль Rewrite в данный момент должен работать с физическими путями к файлам и страницам. Дело в том, что физические (реальные) пути отличаются от тех, что прописаны в URL, поэтому в случае отсутствия необходимой настройки на сервере директивы Rewrite могут работать неправильно. Об этом в файле .htaccess, устанавливаемом вместе с Joomla, есть соответствующее напоминание (см. "Файл .htaccess в CMS Joomla"), файл с комментариями на русском языке, строка 54).  

RewriteCond
Определяет условие, при котором будет выполнено правило, прописанное в  RewriteRule; состоит из переменной, значения переменной и флагов. Может применяться сразу несколько разных условий, каждое из которых прописывается в отдельной строке, которая начинается с данного выражения.

RewriteRule
Эта директива является правилом, которое будет выполнено при совпадении условий, прописанных в RewriteCond. Состоит из шаблона, подстановки и флагов.

 

Код перенаправления

Код перенаправления, прописанный в файле .htaccess, выглядит обычно так (общий принцип):

  1    Options +FollowSymlinks
  2    RewriteEngine On
  3    RewriteCond %{ПЕРЕМЕННАЯ} ^УСЛОВИЕ$ [ФЛАГИ]
  4    RewriteRule ШАБЛОН ПОДСТАНОВКА [ФЛАГИ]

Первая строка. При чтении файла система сначала получает разрешение на переход по ссылкам, если, конечно, это не запрещено провайдером. 

Вторая строка.  Далее система получает команду включить механизм преобразования.

  Разрешение на переход по ссылкам прописывается только один раз в начале файла.

  Команда на включения механизма преобразования прописывается только один раз в начале файла. Однако действие этого механизма может быть остановлено в любой последующей строке командой RewriteEngine Off.

Третья и четвёртая строки. Несмотря на то, что выражение RewriteRule стоит после RewriteCond, система будет искать именно RewriteRule. Дело в том, что RewriteRule может существовать и без каких-либо дополнительных условий, а вот RewriteCond является дополнением и само по себе существовать не может.

Принцип работы системы виден из рисунка: 

Если директива RewriteRule найдена, то начинается сравнение текущего URI с ШАБЛОНОМ.

 Обратите внимание! В RewriteRule ШАБЛОН сравнивается не с URL, а именно с URI, т.е. с адресом страницы (без указания домена)!

Что бы не путать эти два понятия посмотрите следующий рисунок:

Например, если получен запрос с URL https://my_site.ru/main_menu/page1.html, то ШАБЛОН в строке RewriteRule будет сравниваться с URI, т.е. с /main_menu/page1.html, а всё остальное будет отброшено.

Чаще всего шаблон прописывается как  .*  или  ^(.*)$, где  .  означает "любой символ", а   означает любое количество символов или их отсутствие, т.е. фактически любой URI соответствует данному условию. Отличие первого варианта от второго заключается в том, что во втором варианте  (.*)  взяты в скобки, а значит текущий URI не просто проверяется на соответствие, а ещё и записывается в переменную, которую далее можно будет использовать в подстановке. Такие переменные обозначаются по порядку $1, $2, $3 … $9, т.е. их может быть от 1 до 9, в зависимости от того, сколько выражений в скобках прописано в RewriteRule. Метасимвол ^, имеющийся во втором варианте, означает "от начала строки", а метасимвол $ - "от конца строки", т.е. получается "вся строка должна быть проверена".

Если ШАБЛОН совпадёт с текущим URI (в случае, рассмотренном выше, это будет любой URI) система будет проверять, есть ли УСЛОВИЯ для данного правила; эти условия прописываются в строке (строках)  RewriteCond, расположенных выше данного RewriteRule, но только до предыдущего RewriteRule.

В RewriteCond сначала прописывается тип переменной, значение которой будет автоматически получено сервером (например, HTTP_HOST, что означает "адрес сервера, домен"), затем полученное значение проверяется на совпадение с УСЛОВИЕМ. Условие – это perl-совместимое регулярное выражение с дополнениями (будут описаны ниже). Так же в этой строке могут быть прописаны ФЛАГИ, т.е. дополнительные опции.

Если полученное значение переменной и УСЛОВИЕ совпало, начинается выполнение главной операции, прописанной в RewriteRule: ПОДСТАНОВКИ. В качестве подстановки, как правило, используется какой-либо адрес (домен), который будет подставлен вместо текущего; при необходимости рядом с этим адресом (доменом) может быть прописана какая либо переменная из $1 - $9 или %1 - %9, что добавит к адресу значение, находящееся в этой переменной. В конце строки, после подстановки, указываются флаги, т.е. специальные опции.

 Обратите внимание! Если флагов используется несколько, например, [R=301,L], то никаких пробелов между ними быть не должно, иначе правило работать не будет:

[R=301, L] - НЕПРАВИЛЬНО!

[R=301,L] - ПРАВИЛЬНО!

Более подробно всё это будет разобрано в примерах, расположенных ниже.

Дополнения для УСЛОВИЯ в RewriteRule

! Ставится перед УСЛОВИЕМ или ПРОВЕРКОЙ (см. ниже); означает несоответствие, отрицание данных, прописанных    в шаблоне УСЛОВИЯ. Т.е. если в обычном варианте значение, полученное переменной %{ПЕРЕМЕННАЯ} сравнивается с УСЛОВИЕМ и правило сработает только при совпадении, то в случае, если перед УСЛОВИЕМ стоит метасимвол !, правило сработает при несовпадении.
-d Проверка: является ли каталогом.
-l Проверка: является ли символической ссылкой.
-f Проверка: является ли обычным файлом.
-s Проверка: является ли обычным файлом с ненулевым размером.
-U Проверка: существует ли указанный URL через подзапрос.
-F Проверка: существует ли указанный файл через подзапрос.
<УСЛОВИЕ В данном случае УСЛОВИЕ считается обычной строкой и лексически сравнивается с текущим URL. Если текущий URL лексически меньше чем УСЛОВИЕ, принимается значение TRUE (истина); соответственно, правило будет выполнятся.
>УСЛОВИЕ В данном случае УСЛОВИЕ считается обычной строкой и лексически сравнивается с текущим URL. Если текущий URL лексически больше чем УСЛОВИЕ, принимается значение TRUE (истина); соответственно, правило будет выполнятся.
=УСЛОВИЕ В данном случае УСЛОВИЕ считается обычной строкой и лексически сравнивается с текущим URL.  Если текущий URL лексически равен УСЛОВИЮ, принимается значение TRUE (истина); соответственно, правило будет выполнятся.

 

Ниже приведены несколько примеров перенаправления с одного адреса на другой.

Пример № 1: Указание главного зеркала сайта

Допустим, что у ваc к одному сайту подключено два домена – мой_сайт.рф и my_site.ru; соответственно, они оба используют один и тот же файл .htaccess. Вам необходимо, что бы при обращении пользователей или роботов поисковых систем к my_site.ru происходило перенаправление на мой_сайт.рф. Это нужно для того, что бы роботы поисковых систем не индексировали сайт через домен my_site.ru, а домен мой_сайт.рф рассматривали как главное зеркало сайта. Раньше это прописывалось в файле robots.txt (директива Host), но в настоящее время директива Host отменена, поэтому необходимо установить постоянный 301 Redirect, указывающий роботам на главное зеркало сайта. Сделать это можно при помощи соответствующего кода: 

   1     Options +FollowSymlinks
   2     RewriteEngine on
   3     RewriteCond %{HTTP_HOST} ^my_site.ru$ [NC]
   4     RewriteRule ^(.*)$ https://xn--80arbjktj.xn--p1ai/ [R=301,L]

Разберём построчно, что здесь написано.

  1     Options +FollowSymlinks

- разрешает переход по символическим ссылкам.

  2     RewriteEngine on

- включает функцию.

  3     RewriteCond

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

  4     %{HTTP_HOST}

- указывает тип переменной и получает её значение (синтаксис выражения: %{ПЕРЕМЕННАЯ}). Так как в данном примере использована переменная HTTP_HOST, что означает "адрес сервера" (домен), то данная переменная получит из текущего URL только доменное имя (без https://); соответственно, далее в УСЛОВИИ может быть указан только определённый адрес сервера (домен); если указанный адрес сервера совпадёт с запрошенным, то правило начнёт выполняться.

   ^my_site.ru$

- это УСЛОВИЕ: указывает домен (адрес сервера), с которым будет сравниваться значение, полученное переменной HTTP_HOST; так как  перед доменом и после стоят метасимволы ^ и $, указывающие начало и окончание строки, то домен, указанный в текущем URL должен точно совпадать с my_site.ru; если в URL будет прописан, например, домен со слэшем my_site.ru/, то совпадение с условием не произойдёт и, соответственно, правило выполнено не будет.

   [NC]

- отключает проверку регистра, что весьма удобно: если пользователь ошибочно укажет какой-либо символ заглавной буквой (например, напишет mY_siTe.ru), то всё равно условие будет соблюдено.

   RewriteRule

- предписывает правило, которое будет выполняться, если текущий URI будет соответствовать шаблону и при совпадении условий, указанных в RewriteCond.

   ^(.*)$

- это выражение в данном примере применяется как ШАБЛОН; указанное выражение применяется к текущему URL. В данном случае шаблону будет соответствовать любой текущий URL; при этом он будет записан в переменную $1. Надо сказать, что в данном примере скобки можно не применять, так как в подстановке никакие переменные не используются.

   https://xn--80arbjktj.xn--p1ai/

- это ПОДСТАНОВКА, т.е. правило преобразования, которое в данном примере указывает адрес, на который нужно перенаправить пользователя или робота-обходчика.

 Обратите внимание, на то, что указанный адрес отличается от мой_сайт.рф; это объясняется тем, что применять кириллицу в файле .htaccess нельзя! Дело в том, что по стандарту, применяемому к доменным именам, допускаются только буквы латинского алфавита, дефис и цифры от 0 до 9; соответственно, домен на кириллице должен быть преобразован с помощью специального метода, который получил название Punycode. Поэтому никогда не забывайте преобразовывать домены на кириллице!!!

   [R=301,L]

- это выражение указывает, что сервером должен быть выдан ответ 301 Redirect (перемещён постоянно), а буква L указывает на окончание процесса. Обратите внимание на то, что если не указано значение для R, будет автоматически подставлено значение 302. Так же не забывайте ставить букву L, иначе процесс не будет остановлен и вы получите слишком большое количество ответов, в результате чего браузер заблокирует вывод страницы сайта.

Результатом применения данной директивы является перенаправление пользователей и роботов-обходчиков с домена my_site.ru на домен мой_сайт.рф. То есть, если перевести всю эту конструкцию на обычный язык, то получим приблизительно следующее:

"Если в запрошенном адресе домен совпадает с my_site.ru, то необходимо перенаправить запрос на мой_сайт.рф и закончить процесс".

В примере, рассмотренном выше, есть существенные недостатки. Например, если пользователь попытается зайти на какую-нибудь страницу используя домен my_site.ru, то он в любом случае попадёт на главную страницу главного зеркала, а не на запрашиваемую. Так же этот вариант не обеспечивает исправление адресов с www на адреса без www (или наоборот), поэтому придётся писать дополнительные кодовые конструкции. А можно ли сделать конструкцию по принципу "всё в одном"? Конечно можно! Всё это показано в следующем примере.

Пример № 2: Указание главного зеркала сайта с перенаправлением
на такую же страницу главного зеркала

Предположим, что к вашему сайту подключено два домена (как и в предыдущем примере):  мой_сайт.рф и my_site.ru. Каждый из этих доменов так же может быть записан в другом варианте – www.мой_сайт.рф и  www.my_site.ru, т.е. получается уже четыре варианта! Если для вас это один и тот же сайт, то для поисковиков это всё разные сайты с одинаковым содержанием, а это очень сильно не приветствуется, поэтому нужно с помощью файла .htaccess указать главное зеркало сайта, которое будет индексироваться поисковиком и попадёт в выдачу. При этом было бы очень хорошо, что бы пользователь (в том числе и робот поисковой системы), который зашёл на какую-либо страницу используя "неправильный" домен, был сразу перенаправлен на такую же страницу с "правильным" доменом.

Как это сделать?

Для этого будем использовать несколько УСЛОВИЙ для одного правила. Сначала пропишем само правило:

RewriteRule ^(.*)$ https://xn--80arbjktj.xn--p1ai/$1 [R=301,L]

Это правило при соблюдении УСЛОВИЙ будет перенаправлять на запрошенную страницу с "правильным" доменом. Происходить это будет за счёт того, что к указанному в ПОДСТАНОВКЕ домену будет приписываться переменная $1, в которой содержится адрес страницы (URI), полученный из ШАБЛОНА ^(.*)$. Т.е. адрес URI записывается в переменную $1, а затем подставляется уже к новому домену, прописанному в ПОДСТАНОВКЕ, в результате чего получается другой, "правильный" адрес страницы.

Далее прописываем УСЛОВИЯ:

RewriteCond %{HTTP_HOST} ^www\.my_site.ru$ [NC,OR]

- это условие проверяет на совпадение www\.my_site.ru с доменом из текущего URL;

RewriteCond %{HTTP_HOST} ^my_site.ru$ [NC,OR]

- это условие проверяет на совпадение my_site.ru с доменом из текущего URL;

RewriteCond %{HTTP_HOST} ^www\.xn--80arbjktj.xn--p1ai$ [NC]

- это условие проверяет на совпадение www\.xn--80arbjktj.xn--p1ai с доменом из текущего URL.

Здесь применяются сразу три разных УСЛОВИЯ, но благодаря применению флага OR (в значении "или")  выполнение правила будет запущено при совпадении с любым из этих условий. Соответственно, все неправильные запросы любых страниц, использующих "неправильные" доменные адреса, будут перенаправлены на соответствующую страницу главного зеркала.

В результате получаем вот такую конструкцию:

  1     Options +FollowSymlinks
  2     RewriteEngine on
  3     RewriteCond %{HTTP_HOST} ^www\.my_site.ru$ [NC,OR]
  4     RewriteCond %{HTTP_HOST} ^my_site.ru$ [NC,OR]
  5     RewriteCond %{HTTP_HOST} ^www\.xn--80arbjktj.xn--p1ai$ [NC]
  6     RewriteRule ^(.*)$ https://xn--80arbjktj.xn--p1ai/$1 [R=301,L]

Несколько слов о применении флага OR.

Как уже говорилось, если в конце RewriteCond стоит флаг OR это значит, что если  УСЛОВИЕ не совпадает с переменной, то правило всё равно может сработать, если окажется, что в следующем RewriteCond УСЛОВИЕ с переменной совпадёт, т.е. должно быть совпадение хотя бы в одном из вариантов.

Если в конце RewriteCond нет флага OR, и при этом применяются несколько RewriteCond, это значит, что правило будет запущено только при условии совпадения всех УСЛОВИЙ.

Так же есть возможность использовать и смешанный вариант. Рассмотрим его на примере только что перед этим полученной конструкции, но немного её изменим.

  1    Options +FollowSymlinks
  2     RewriteEngine on
  3     RewriteCond %{HTTP_HOST} ^www\.my_site.ru$ [NC,OR]
  4     RewriteCond %{HTTP_HOST} ^my_site.ru$ [NC,OR]
  5     RewriteCond %{HTTP_HOST} ^www\.xn--80arbjktj.xn--p1ai$ [NC]
  6     RewriteCond %{REQUEST_URI} ^(.*)$ [NC]
  7     RewriteRule ^(.*)$ https://xn--80arbjktj.xn--p1ai/%1 [R=301,L]

Как видим, здесь в ПОДСТАНОВКЕ переменная $1 изменилась на %1 и появилась новая строка:

RewriteCond %{REQUEST_URI} ^(.*)$ [NC]

Эта строка нужна для того, что бы получить URI и внести его в переменную  %1 (за счёт имеющейся в этой строке ^(.*)$). Результат выполнения в данном случае ни чем не будет отличаться от изначального варианта, но здесь для нас интересно то, что вся эта конструкция будет работать с применением смешанного варианта использования флага OR.

Правило будет выполнено если в третьей, четвёртой или пятой строке полученная переменная совпадёт с прописанным УСЛОВИЕМ и переменная в шестой строке так же совпадёт с имеющимся там УСЛОВИЕМ, т.е. должно произойти совпадение в 3, или 4, или 5 строке и обязательно в шестой.  

Не сложно догадаться, что так как в данном примере шестая строка совпадёт с любым условием и используется лишь для получения URI, то она, в принципе, не нужна, намного проще использовать переменную $1, как это и было в начале. Однако, этот пример показывает, что при необходимости можно использовать смешанный вариант применения флага OR.

Пример № 3: Установка запрета доступа к определённой странице сайта 

Иногда возникает необходимость запретить доступ к определённой странице; особенно это важно для поисковых роботов: например, страница была вами удалена, или когда-то была неправильно проиндексирована роботом. В этом случае её нужно удалить из поисковой базы при помощи сервиса Вебмастер, но перед этим нужно запретить доступ к ней.

Попробуем составить соответствующую конструкцию для страницы мой_сайт.рф/page1.html.

Для начала вспомним о том, что кириллицу применять нельзя, поэтому сразу перепишем адрес (при помощи Punycode):

https://xn--80arbjktj.xn--p1ai/page1.html

Далее составим правило в директиве RewriteRule. В начале в качестве ШАБЛОНА используем ^(.*)$ или .*. Далее прописываем знак - , который означает, что никакой ПОДСТАНОВКИ нет и не будет. В конце ставим флаг  [F], означающий, что сервер должен выдать ответ 403 ("Запрещено"). В результате получаем строку:

RewriteRule ^(.*)$ - [F]

Далее прописываем ПЕРЕМЕННУЮ и УСЛОВИЕ в директиве RewriteCond. Переменную HTTP_HOST здесь использовать нельзя, так как в результате будет получен только адрес сервера (домен), а не адрес конкретной страницы. Поэтому в качестве переменной будем использовать REQUEST_URI, что позволяет получить адрес запрашиваемой страницы из строки запроса, но без указания домена. Далее мы прописываем в УСЛОВИИ соответствующий адрес: /page1.html$ . Обратите внимание: перед адресом нет знака ^, что означает, что строка текущего URL может начинаться с чего угодно, но заканчиваться она должна именно как указано в УСЛОВИИ, так как в конце стоит знак $, указывающий, что именно так должен заканчиваться текущий URL. Если это не условие не соблюдается, то и правило работать не будет! Далее прописываем всё перед строкой RewriteRule и в результате получаем:

  1     Options +FollowSymlinks
  2     RewriteEngine On
  3     RewriteCond %{REQUEST_URI} /page1.html$ [NC]
  4     RewriteRule ^(.*)$ - [F]

Теперь при обращении к данной странице пользователи и роботы поисковиков будут получать ответ с кодом 403: "Запрещено".

Пример № 4: Использование проверки

Разберём использование проверки на конструкции, которая установлена в файле .htaccess по умолчанию; давайте попробуем понять, для чего она нужна и как работает:

  1     Options +FollowSymlinks
  2     RewriteEngine On
  3     RewriteCond %{REQUEST_URI} !^/index\.php
  4     RewriteCond %{REQUEST_FILENAME} !-f
  5     RewriteCond %{REQUEST_FILENAME} !-d
  6     RewriteRule .* index.php [L]

Как говорилось ранее, система изначально ищет в файле директиву RewriteRule. В этом примере в данной директиве мы видим, что ШАБЛОН допускает применение правила к  любым адресам, поэтому дальше начинается проверка директив RewriteCond, связанных с этой директивой.

В первой директиве RewriteCond использована ПЕРЕМЕННАЯ REQUEST_URI, которая получает адрес страницы из строки запроса, но без указания домена. УСЛОВИЕ, прописанное в этой строке, означает, что текущий URI не должен совпадать с /index.php, на что указывает метасимвол !, т.е. под это условие попадают все адреса, кроме /index.php. Метасимвол \, стоящий перед точкой, означает, что следующий за ним знак (точка) являются просто точкой, а не метасимволом, иначе он будет воспринят сервером не правильно. Если перевести на обычный, "человеческий" язык эту директиву, то получим следующее:

Если запрошенный путь или файл не совпадает с /index.php и запрос еще не был внутренне переписан в скрипт index.php, то можно перейти к проверке следующей директивы RewriteCond.

Во второй директиве RewriteCond используется ПЕРЕМЕННАЯ REQUEST_FILENAME, которая получает полный путь на сервере к файлу, соответствующему запросу. !-f проверяет, являются ли данные, полученные переменной, обычным файлом. Обратите внимание: для того, что бы УСЛОВИЕ было соблюдено, эти данные не должны быть обычным файлом, о чём говорит метасимвол !. Если перевести на обычный, "человеческий" язык эту директиву, то получим следующее:

Если запрос не соответствует физическому файлу, то можно перейти к проверке следующей директивы RewriteCond.

Третья директива RewriteCond похожа на вторую, за исключением того, что объектом проверки является не файл, а каталог (!-d). Но обычном, "человеческом" языке эта директива звучит так:

Если запрос не соответствует физической папке (каталогу), то можно перейти к выполнению ПОДСТАНОВКИ в RewriteRule.

Далее ПОДСТАНОВКА в директиве RewriteRule просто подставляет index.php и завершает процесс (флаг [L]). В итоге мы получаем следующее правило:

Если запрошенный путь или файл не совпадает с /index.php и запрос еще не был внутренне переписан в скрипт index.php, при этом запрошенный путь и файл не соответствуют физическому файлу или физической папке (каталогу), то запрос переписывается (перенаправляется) в index.php.

Пример № 5: Указание на определённый сайт в соответствии с браузером пользователя

Иногда по определённым причинам один и тот же сайт может быть создан в нескольких вариантах, каждый из которых будет выдаваться в соответствии с браузером пользователя. В этом случае страницы сайта находятся в соответствующих папках, например, "yandex", "mozilla", "lunx" т т.д. В этом случае в файле .htaccess прописывается следующий код:

  1     Options +FollowSymlinks
  2     RewriteEngine On
  3     RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
  4     RewriteRule ^(.*)$ /mozilla/$1 [L]
  5     RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
  6     RewriteRule ^(.*)$ /lynx/$1 [L]
  7     RewriteRule ^(.*)$ /default/$1 [L]

Здесь ничего сложного нет: переменная %{HTTP_USER_AGENT} получает данные о браузере пользователя, сравнивается с УСЛОВИЕМ, и при совпадении подставляет нужный вариант.

Пример № 6: Установка времени доступа к сайту

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

  1     Options +FollowSymlinks
  2     RewriteEngine On
  3     RewriteCond %{TIME_HOUR}%{TIME_MIN} > 130
  4     RewriteCond %{TIME_HOUR}%{TIME_MIN} < 550
  5     RewriteRule .* - [ F ]

Как это работает? Обратите внимание на строки RewriteCond: в них используются две переменные подряд без пробела. Переменная TIME_HOUR возвращает текущий час, а переменная TIME_MIN – минуты. Так как обе переменные идут друг за другом без пробела, то и полученный ответ будет выглядеть соответственно. Например, если время 18 часов 24 минуты, то в результате запроса мы получим число 1824, которое будет сравниваться с поставленным УСЛОВИЕМ. Не сложно понять, что в представленном примере время, когда сайт будет закрыт для всех, начинается в 1 час 30 минут ночи и заканчивается в 5 часов 50 минут утра. А то, что прописано в RewriteRule мы уже изучали ранее в примере № 2.

Пример № 7: Запрет индексирования для какого либо поисковика

При необходимости вы можете запретить доступ к сайту или к его определённым страницам роботов одного или нескольких поисковиков. Для этого прописываем такую конструкцию:

  1     Options +FollowSymlinks
  2     RewriteEngine On
  3     RewriteCond %{HTTP_USER_AGENT} Googlebot
  4     RewriteRule .* - [F]

Здесь всё очень просто: ПЕРЕМЕННАЯ HTTP_USER_AGENT получает информацию о пользователе и проверяет её на совпадение с УСЛОВИЕМ. Если это окажется робот Google, ему будет выдан запрет на посещение сайта.

 

Пример № 8: Перенаправление с .htm на .html

Эта конструкция применяется для исправления ошибок при наборе запроса, когда на конце вместо .html пишут .htm :

  1     Options +FollowSymlinks
  2     RewriteEngine On
  3     RewriteBase   /
  4     RewriteRule ^(.*)\.htm$  $1.html [R=301]

 

Работа с ошибками

Если во время работы сервера возникает ошибка, то сервер возвращает браузеру код данной ошибки в соответствии с существующим стандартом (коды ошибок можно просмотреть здесь: "Коды ответов сервера").

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

  1     ErrorDocument 404 https://my_site.ru/error-404.htm

 Стоит обратить внимание на то, что в CMS Joomla в случае возникновения ошибки запускается файл error.php, находящийся в папке шаблона, который используется в текущий момент. Поэтому что либо прописывать в файле .htaccess просто нет смысла, а для оформления страницы с ошибкой используйте файл error.php!

Индексные страницы

Обычно при запросе система вначале обращается к файлу index.php, а если его нет, то пользователю выводится содержимое сайта (каталога) или, при установленном запрете просмотра директорий, выдаётся ошибка 403.

Вывод списка файлов в каталоге называется листинг. За этот процесс отвечает директива Indexes; если в Option будет установлено Indexes, то листинг выдаваться не будет.

Если вам необходимо запретить выдачу в листинге только некоторых файлов, то следует прописать следующее:

  1     IndexIgnore *.тип файла

В этом случае в листинг не попадут файлы указанного типа (с указанным расширением).

 Стоит обратить внимание на то, что при установке CMS Joomla в предустановленном файле .htaccess имеется следующая конструкция:

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

Это означает, что если запрошенный путь (файл) не index.php и запрос еще не был внутренне переписан в скрипт index.php, если запрошенный путь и файл не соответствуют физическому файлу, а так же если запрошенный путь и файл не соответствуют физической папке, то запрос автоматически переписывается в скрипт index.php.

Установка соответствующей кодировки

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

  1     AddDefaultCharset тип кодировки

Это устанавливает кодировку всего, что получает браузер о сервера.

Можно установить кодировку для всех файлов, загружаемых на сервер:

  1     CharsetSourceEnc тип кодировки

А следующее выражение отменяет перекодировку загружаемых файлов:

  1     CharsetDisable on

 

 

Добавлять комментарии и ответы могут только пользователи, прошедшие регистрацию!
Зарегистрируйтесь и напишите своё мнение или ответ!