Запрещаем действие htaccess из корня сайта на папку уровнем ниже

Как ни странно, поиск в сети не дает легкого ответа на вопрос из заголовка. Возможно, он запрятан на 155 странице … гм, известного поисковика, но мне не хватило терпения туда добраться )). Поэтому делюсь опытом здесь — может быть, он кому-то пригодится.

Я уже, кажется, писал в одной из статей, что мы (сотрудники компании «Петролекс») — не IT-шники. Но более чем 20-летний опыт «уверенных пользователей ПК» 😎 к чему-то да обязывает )). Все для своего сайта стараемся делать сами, без привлечения сторонних специалистов. Чаще всего это получается, но бывает, что знаний в каких-то областях не хватает…

Не так давно мы решили, что на нашем сайте обязательно нужен блог (одну из статей которого Вы сейчас и читаете )). Даже не очень опытный веб-мастер наверняка уже догадался, что он — на движке WordPress. А Вордпресс при ближайшем рассмотрении — сильно «навороченная» система, с множеством собственных настроек, и чтобы его использовать, есть всего два варианта:

  • либо строить полностью весь сайт на данной CMS (такое решение годится для новых сайтов, создаваемых с нуля — не наш вариант);
  • либо разворачивать блог на WordPress в отдельной папке, чтобы с прочими элементами уже существующего сайта он пересекался по минимуму (иначе дружить друг с другом они, скорее всего, не будут).

У нас именно второй случай. Сайт petrpleks.ru (до 2015 года располагавшийся на домене petrograd.biz) — ресурс с многолетней историей. И, конечно, у него в корне лежит файл .htaccess с довольно большим количеством различных директив. Например, в нем прописаны правила переадресации на собственные страницы ошибок и «http > https», приведения в «удобочитаемый» вид URL-адресов, отображаемых в адресной строке браузеров, кое-какие запреты на кое-какие действия )) … и т.д.

Для тех, кто не знает, что это за файл «.htaccess» такой, и для чего он служит, давать пояснения не буду — не об этом статья, а интернет велик…

Так вот, у WordPress’а свой собственный .htaccess, и, т.к. мы рассматриваем случай, когда WordPress установлен не в корень, а в папку «большого сайта», в котором блог — только один из его элементов, в  этой самом папке данный файл и находится.

Чтобы было понятнее: допустим, сайт имеет на хостинге основную, корневую папку «public_html», а в ней для размещения блога Вы создали подпапку «wp». Тогда, если URL Вашего сайта, например, https://moy_otlichniy_sait.ru, то, соответственно, адрес блога будет таким: https://moy_otlichniy_sait.ru/wp/

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

Общедоступные страницы отображались, но не работала должным образом админка… не буду вдаваться в детали, скажу одно — использовать такой «недоделанный» блог по назначению было невозможно.

Проблема заключалась в том, что файл .htaccess верхнего уровня всегда будет «глушить» .htaccess, лежащий уровнем ниже, при наличии в них одинаковых директив. Директивы из коревой директории выполняются в первую очередь. Это общеизвестное правило. Задача состояла в том, как его обойти.

Обратились за помощью в техподдержку хостинг-провайдера. Вообще-то в прямые обязанности службы поддержки не входит «починка» конфликтующих скриптов на сайтах пользователей, но, тем не менее, ее специалисты часто помогают полезными советами. Но в данном случае этого не произошло, ответ сотрудника поддержки еще больше все запутал.

В техническую поддержку был задан примерно такой вопрос: «В корневой директории сайта находится файл htaccess. Подскажите, можно ли настроить этот файл так, чтобы действие его директив не распространялось на файлы в определенной папке уровнем ниже?»

Увы, сначала специалист поддержки вообще не понял, что мы хотим. Последовал довольно длительный диалог… Ответ же «по существу» был следующим (цитата): «Настроить исключения для работы всего файла .htaccess в поддиректории сайта нет технической возможности, но на версиях PHP 7.4 и новее возможно прописать исключения для некоторых отдельных директив, если возникнут конфликты. Для этого можно использовать условный блок <If>.»

Т.е. сотрудник изящно ушел от ответа… который, к как оказалось позже, попросту не знал.

Честно признаюсь, его авторитетное «настроить исключения… нет технической возможности», тогда нас очень смутило. Мы не великие знатоки языка «htaccess» и хотя сами иногда пишем директивы для него (это ведь требуется не часто), сначала смотрим примеры и каждый раз какое-то время разбираемся в логике их команд (всегда нужно понимать, что ты пишешь, а не слепо копировать что-то где-то случайно увиденное, иначе толку не будет). А тут нам ответил работник хостинга, который по логике вещей «должен быть в теме»…

Т.к. у нас достаточно основной работы, не связанной с разработкой сайта, идея о блоге была на некоторое время отложена. Было совершенно некогда углубляться в вопрос, что же именно и каким образом конфликтует в «верхнеуровневом» и «родном вордпрессовском» htaccess.

Однако решение вскоре нашлось — подсказал знающий человек (спасибо ему).  И оно оказалось намного проще, чем тот путь с использованием <If>, на который намекал консультант с хостинга.

Вот это решение, мы добавили всего одну строку к уже существующему коду:

<IfModule mod_rewrite.c>   // проверка наличия на сервере Apache модуля mod_rewrite
RewriteEngine on   // команда на выполнение расположенных ниже директив блока IfModule

 

RewriteRule ^wp/ — [L]   // та самая строка — запрещает действие htaccess на папку ‘wp’

 

# Переадресация http > https   // у нас дальше так, а у Вас может быть по другому…
RewriteCond %{HTTP:HTTPS} !=on [NC]
… и т.д.
</IfModule>

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

RewriteRule ^vasha_papka/ — [L]

И все!!! Теперь наш WprdPress больше не «ругается» и отлично работает.

Конечно, эту строку следует прописать в соответствующем месте htaccess, для чего нужно хотя бы элементарное понимание его синтаксиса.

В заключении отмечу, что описанный здесь «хак» можно использовать не только для WordPress, а и во всех случаях, когда есть потребность «освободить» на сайте от воздействия «верхнеуровневого» htaccess одну или несколько папок. Ну, Вы ведь и сами догадались? 😉

 

Поделиться:

Добавить комментарий