Настройка временного и постоянного редиректа в Apache

Published by Leave your thoughts

HTTP-перенаправление (или редирект) – это способ направить один домен или адрес на другой. Существует несколько видов перенаправления, каждый из которых по-разному воспринимается клиентским браузером. Самые распространённые виды – это временный и постоянный редирект.

Временный редирект используется в случае если контент, доступный по одному URL-адресу, нужно временно обслуживать из другого каталога. К примеру, если сайт находится на обслуживании, вы можете перенаправить запросы к домену на пользовательскую страницу ошибок, где посетители смогут узнать, когда сайт будет доступен.

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

Чтобы создать временный редирект в Apache, добавьте в виртуальный хост такую строку:

Redirect /oldlocation http://www.newdomain.com/newlocation

Чтобы настроить постоянный редирект, добавьте в файл виртуального хоста:

Redirect permanent /oldlocation http://www.newdomain.com/newlocation

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

Требования

  • Настроенный сервер.
  • Установленный веб-сервер Apache 2.
  • Виртуальный хост (эти руководства помогут создать виртуальный хост в Ubuntu 16.04, CentOS 7 и Debian 7).

Простая настройка редиректа

Чтобы настроить простой редирект одной страницы в Apache, можно использовать директиву Redirect, которая входит в модуль mod_alias. Модуль включен в Apache по умолчанию. Директиве нужно иметь минимум два аргумента: старый URL-адрес и новый URL-адрес. С её помощью можно настроить как временное, так и постоянное перенаправление.

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

<VirtualHost *:80>
ServerName www.domain1.com
Redirect / http://www.domain2.com
</VirtualHost>
<VirtualHost *:80>
ServerName www.domain2.com
. . .
</VirtualHost>

Теперь браузер будет направлять все запросы к www.domain1.com на домен www.domain2.com. Однако такое решение работает только с одностраничными сайтами.

Редирект объемных сайтов настраивается иначе. Для этого используется директива RedirectMatch, которая с помощью регулярных выражений может указывать целый каталог вместо одного файла.

Читайте также: Использование Grep и регулярных выражений для поиска текстовых шаблонов в Linux

Директива RedirectMatch выполняет поиск по шаблонам регулярных выражений в круглых скобках, а затем ссылается на найденный текст как на целевой каталог переадресации с помощью выражения $1 (где 1 — первая группа найденного текста). В более сложных примерах перенаправления группы, совпавшие с шаблонами, получают последовательные номера.

К примеру, чтобы временно перенаправить все страницы домена www.domain1.com на www.domain2.com, нужно добавить в файл:

<VirtualHost *:80>
ServerName www.domain1.com
RedirectMatch ^/(.*)$ http://www.domain2.com/$1
</VirtualHost>
<VirtualHost *:80>
ServerName www.domain2.com
. . .
</VirtualHost>

По умолчанию директивы Redirect и RedirectMatch устанавливают временный редирект. Чтобы с их помощью настроить постоянный редирект, нужно добавить в настройки опцию permanent:

Redirect permanent / http://www.domain2.com
RedirectMatch permanent ^/(.*)$ http://www.domain2.com/$1

Более гибкую настройку редиректа предоставляет модуль mod_rewrite, но его использование выходит за рамки данного руководства.

Читайте также: Настройка mod_rewrite на веб-сервере Apache в Ubuntu 14.04

Пример 1: переход на другой домен

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

В таком случае нужно настроить редирект со старого домена (например, domain1.com) на новый (domain2.com). Чтобы навсегда сменить доменное имя сайта, используйте постоянный редирект. Благодаря этому браузер сможет перенаправлять поступающий трафик на новый домен.

Итак, предположим, что на данный момент сайт обслуживается по домену domain1.com, а его виртуальный хост находится в /etc/apache2/sites-available/domain1.com.conf:

<VirtualHost *:80>
ServerAdmin admin@domain1.com
ServerName domain1.com
ServerAlias www.domain1.com
DocumentRoot /var/www/domain1.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Виртуальный хост для нового домена сайта, /etc/apache2/sites-available/domain2.com.conf, должен выглядеть так:

<VirtualHost *:80>
ServerAdmin admin@domain2.com
ServerName domain2.com
ServerAlias www.domain2.com
DocumentRoot /var/www/domain2.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Теперь измените настройки виртуального хоста domain1.com и добавьте в них постоянный редирект на domain2.com:

<VirtualHost *:80>
ServerAdmin admin@domain1.com
ServerName domain1.com
ServerAlias www.domain1.com
DocumentRoot /var/www/domain1.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RedirectMatch permanent ^/(.*)$ http://domain2.com/$1
</VirtualHost>

В данном случае используется директива RedirectMatch, а не Redirect, поскольку сайт состоит из нескольких страниц. Регулярное выражение ^/(.*)$ совпадает с любым текстом, идущим в URL-адресе после /. Таким образом, http://domain1.com/index.html будет перенаправляться на http://domain2.com/index.html.

Чтобы настроить постоянный редирект, нужно просто добавить опцию permanent в директиву RedirectMatch.

Примечание: После изменения виртуального хоста нужно перезапустить Apache, чтобы обновить настройки:

systemctl restart apache2

Пример 2: перенаправление страницы

В некоторых ситуациях возникает необходимость изменить название уже опубликованной страницы. Если вы просто измените название (без настройки редиректа), при запросе исходного URL-адреса страницы будет возникать ошибка 404 Not Found. Тогда пользователь, который добавил эту страницу в закладки, не сможет найти её, поскольку он использует устаревшую ссылку. Редирект позволяет устранить эту проблему.

Предположим, на вашем сайте есть две отдельные страницы для товаров и услуг, products.html и services.html соответственно, и вы решили объединить эти страницы в одну, offers.html. Чтобы не потерять трафик, нужно настроить редирект products.html и services.html на offers.html.

К примеру, исходный виртуальный хост сайта выглядит так:

<VirtualHost *:80>
ServerName example.com
. . .
</VirtualHost>

Чтобы перенаправить эти две страницы на новую страницу, достаточно добавить в файл две директивы Redirect:

<VirtualHost *:80>
ServerName example.com
Redirect permanent /products.html /offer.html
Redirect permanent /services.html /offer.html
. . .
</VirtualHost>

Директива Redirect принимает исходный адрес страницы, которую нужно перенаправить, а затем адрес новой страницы. Опция permanent обеспечит постоянный редирект. Вы можете использовать неограниченное количество директив Redirect в виртуальном хосте, чтобы перенаправить трафик на новые страницы сайта.

Заключение

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

Редирект HTTP применяется также для обеспечения SSL-шифрования трафика (редирект http на https) и добавления префикса www к домену сайта.

Читайте также:

Tags: , ,

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>