Поиск по сайту:

Как выполнить внутреннее перенаправление с помощью mod_rewrite в Apache


В этой и следующей статьях мы объясним, как использовать mod_rewrite для сопоставления определенных HTTP-запросов с другими страницами веб-сайта или внешним URL-адресом.

Другими словами, этот известный модуль Apache позволит вам перенаправить один URL-адрес на другой, что мы проиллюстрируем практическими примерами.

Рекомендуется к прочтению: 5 советов по повышению производительности вашего веб-сервера Apache

ПРИМЕЧАНИЕ. В приведенных ниже примерах предполагается, что вы хотя бы немного знакомы с регулярными выражениями, совместимыми с Perl (PCRE). Поскольку эта тема выходит за рамки данной статьи, за более подробной информацией о PCRE обратитесь к документации Perl 5 версии 24.0.

Прежде чем продолжить, убедитесь, что модуль перезаписи загружен. Хотя это поведение по умолчанию в CentOS и подобных дистрибутивах, в Debian и его производных вам придется загружать его вручную следующим образом:

a2enmod rewrite

Настройка Apache для использования модуля mod_rewrite

Для простоты давайте воспользуемся сайтом по умолчанию в поле CentOS 7 (IP 192.168.0.100), чтобы объяснить, как использовать mod_rewrite ( DocumentRoot: /var/www/html, файл конфигурации: /etc/httpd/conf/httpd.conf).

Чтобы Apache мог использовать этот модуль, добавьте в файл конфигурации следующую строку:

RewriteEngine on

Важно отметить, что эта конфигурация не будет наследоваться виртуальными хостами в одном и том же ящике.

Таким образом, вам нужно будет добавить RewriteEngine для каждого виртуального хоста, на котором вы хотите использовать правила перезаписи.

Внутреннее перенаправление: сопоставление URL-адреса с другим на том же виртуальном хосте.

Внутреннее перенаправление — это простейший пример mod_rewrite. Если вы хотите перенаправить все запросы для default.aspx на index.html, добавьте следующую строку (также известную как правило перезаписи) в разделе RewriteEngine. > на:

RewriteRule "^/default\.aspx$" "/index.html"

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

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

В этом случае вам нужно будет найти способ перенаправить запрос, чтобы ваши потенциальные посетители не попадали на страницу с ошибкой. Для проверки давайте создадим простой HTML-файл с именем index.html внутри /var/www/html со следующим содержимым:

<!DOCTYPE html>
<html>
  <head>
	<meta charset="utf-8">
	<title>New site</title>
  </head>
  <body>
	<h2>Default.aspx was here, but now it's index.html</h2>
  </body>
</html>

Знаки каретка и доллар заставят регулярное выражение соответствовать любой строке, начинающейся с /default и заканчивающейся .aspx соответственно.

Рекомендуется к прочтению: Установите Mod_Pagespeed, чтобы повысить производительность Apache до 10 раз

Теперь запустите браузер и укажите в нем адрес 192.168.0.100/default.aspx. Если все пойдет так, как ожидалось, Apache должен вместо этого использовать index.html.
Однако конечный пользователь по-прежнему увидит default.aspx в адресной строке, поэтому изменение будет полностью прозрачным:

Если вы хотите, чтобы URL-адрес в адресной строке показывал, что сервер на самом деле обслуживает index.html, а не страницу с именем default.aspx, добавьте [R, L] в конец правила перезаписи следующим образом:

RewriteRule "^/default\.aspx$" "/index.html" [R,L]

Здесь [R,L] — два дополнительных флага, которые указывают, что в браузер (R) должно быть выполнено полное HTTP-перенаправление и что никакие дальнейшие правила обрабатываться не должны:

Обратите внимание, что в адресной строке теперь отображается index.html, как и ожидалось, вместо default.aspx, как это было раньше.

Краткое содержание

В этой статье мы объяснили, как использовать mod_rewrite для выполнения внутреннего перенаправления. Следите за обновлениями до следующего поста, где мы узнаем, как перенаправить на ресурс, который был перемещен на другой сервер, и как отображать пользовательский контент на основе браузера пользователя. А пока обратитесь к документации Apache 2.4 за полным списком доступных флагов перезаписи.

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