mod_rewrite и mod_alias это мощные и функциональные модули веб-сервера Apache, предназначенные для преобразования URL-адресов, редиректов, обработки ошибок и ряда других операций, выполняемых вебмастерами на ежедневной основе.
Я не очень люблю статьи с вирусными заголовками – чаще всего самое интересное и полезное в них заключается в одном-двух абзацах, после чего неизбежно начинается “вода”. Это так, но если дело доходит до mod_rewrite и mod_alias, примеры их использования всегда хороши настолько, что просто не терпится найти им достойное применение.
Конечно, первым шагом должно стать изучение официальной документации, но она редко опускается до интересных кейсов и примеров из реальной жизни. Поэтому здесь я собрал несколько своих заготовок, которые помогут вам решить многие типовые проблемы.
Если ваш сервер работает под Apache, и настройки позволяют использовать .htaccess (а этой 99,99% всех кейсов), никогда не забывайте про этого скромного, но функционального помощника. С его помощью можно изменить некоторые важные настройки и определить поведение сервера в особых ситуациях. В данном контексте я имею ввиду:
Для неискушенного пользователя .htaccess и его директивы могут показаться слишком сложными, поэтому начинать надо с простого.
Несмотря на то, что все современные CMS умеют обрабатывать ошибки и оформлять соответствующие им страницы, иногда необходимо решать эту задачу и более простыми способами. Например, применительно к небольшим лендингам или вспомогательным сайтам.
С .htaccess все предельно просто: создаем страницу ошибки и настраиваем для нее переадресацию:
ErrorDocument 404 /404.html
Про преимущества кастомной страницы для 404-ошибок написано много, поэтому повторяться не будем и позволим читателю ознакомиться с этими материалами в отдельное время. Добавим лишь,что кроме 404 таким образом можно оформить и другие серверные ответы.
Все, что позволяют реализовать mod_rewrite и mod_alias, настолько велико, что уместить все трюки в одной статье просто невозможно физически. Поэтому я расскажу лишь о том, что использую чаще всего. Но прежде обратим внимание на следующее изображение:
Если коротко, то mod_rewrite позволяет реализовать все, что умеет mod_alias плюс еще много всего. Зачем тогда нужен mod_alias?
Прежде всего, mod_rewrite иногда может быть слишком сложным и – что важнее – более ресурсоемким. Поэтому чтобы сократить трафик, CPU-циклы и головную боль, в первую очередь используйте mod_alias. Если же есть четкое понимание того, что задача требует более функционального и безопасного решения, подключайте mod_rewrite.
Независимо от того, в каком порядке директивы располагаются в .htaccess, запомните:
Правила mod_rewrite выполняются раньше, чем mod_alias.
Вроде бы несложно, но учитывать надо. Проиллюстрируем на примере:
RewriteCond %{DOCUMENT_ROOT}/catalog/$1 !-f
RewriteRule ^catalog/(.+)$ /catalog/index.php?$1 [L,QSA]
Имеем директиву mod_rewrite, которая сперва проверит наличие файла по ссылке, и, при его отсутствии (!-f) сформирует человекопонятный URL “тайком” от клиента. Другими словами,
https://example.com/catalog/iphone17
будет использован вместо
https://example.com/catalog/index.php?iphone17
Все отлично, но если в .htaccess найдется редирект для устаревшей ссылки типа
Redirect 301 /catalog/iphone16 https://example.com/catalog/iphone17
, то он не сработает, поскольку запрос catalog/iphone16 будет перехвачен директивой RewriteRule от mod_rewrite. Даже если директива Redirect будет находиться выше RewriteRule в файле .htaccess! Решений может быть несколько, но самым простым станет переход на mod_rewrite:
RewriteRule ^catalog/iphone16 /catalog/iphone17 [R=301,L]
RewriteCond %{DOCUMENT_ROOT}/catalog/$1 !-f
RewriteRule ^catalog/(.+)$ /catalog/index.php?$1 [L,QSA]
Теперь редирект с устаревшего товара будет работать правильно.
Поскольку mod_alias всегда работает от корневой папки (даже если .htaccess с директивой находится во вложенной), его паттерны всегда сравниваются с REQUEST_URI, который начинается с прямого слэша (/), в то время как паттерны mod_rewrite всегда его исключают. Такая вот несовместимость приводит к следующим эквивалентам:
# Директива RewriteRule ^docs/(.*)$ /news/$1 [R=301,L] # Равнозначна этой: RedirectMatch 301 ^/docs/(.*)$ /news/$1
Всегда помните: директива mod_alias Redirect всегда использует полный путь в качестве целевого редиректа, тогда как RedirectMatch – относительный:
# Правильно: RedirectMatch 301 ^/docs/(.*)$ /news/$1 # Неправильно: Redirect 301 /docs/ /news/ # Правильно: Redirect 301 /docs/ https://example.com/news/
Несмотря на то, что в документации mod_alias относительные пути указываются как легитимные, на некоторых серверах это может не работать. Поэтому обязательно тестируйте данную возможность.
Сегодня такие серверные приложения, как ISP panel, позволяют настраивать редиректы для склейки доменов. Однако в работе вам может пригодиться и “низкоуровневый” способ:
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*) https://www.example.com/$1 [R=301,L]
Перенаправление не обязательно должно вести на новый адрес. Это касается любых “четырехсотых” ответов типа 4xx, при которых целевой URI можно сделать единым:
Redirect 403 /errors/forbidden.html Redirect 410 /errors/gone-forever.html
А для надоедливых ботов можно вместо 404 отдавать 412 ответ “доступ к целевому ресурсу отклонен”:
RedirectMatch 412 ^/_vti_bin/
Всего, о чем я рассказал выше, достаточно для первого знакомства с возможностями .htaccess и модулей mod_rewrite / mod_alias. В следующих публикациях расскажем о более сложных задачах и способах их реализации.
© 2008 - 2026 Webmasters.BY Все права защищены
Новый комментарий
Ошибка
Выполнено