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

Как создать временную и постоянную переадресацию с помощью Apache


Введение

Перенаправление HTTP — это способ указать один домен или адрес на другой. Существует несколько различных видов перенаправлений, каждый из которых означает что-то свое для клиентского браузера. Двумя наиболее распространенными типами являются временные перенаправления и постоянные перенаправления.

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

Постоянные перенаправления (код ответа 301 Moved Permanently), с другой стороны, сообщают браузеру, что он должен полностью забыть старый адрес и больше не пытаться получить к нему доступ. Это полезно, когда ваш контент был постоянно перемещен в новое место, например, когда вы меняете доменные имена.

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

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

Точно так же используйте такую строку для постоянного перенаправления:

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

В этом руководстве будет более подробно объяснено, как реализовать каждый вид перенаправления в Apache, а также приведены некоторые примеры для конкретных случаев использования.

Предпосылки

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

  • Один сервер с установленным и настроенным Apache 2 для обслуживания ваших веб-сайтов с виртуальными хостами. Вы можете сделать это, подписавшись на 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, которая использует регулярные выражения для указания целых каталогов, а не только отдельных файлов. 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 в статье Как настроить mod_rewrite для Apache.

Перейдем к конкретным примерам.

Пример 1 — Переезд в другой домен

Если вы установили присутствие в Интернете и хотели бы изменить свой домен на новый адрес, лучше не отказываться от своего старого домена. Закладки на ваш сайт и ссылки на ваш сайт, расположенные на других страницах в Интернете, будут разорваны, если ваш контент исчезнет без каких-либо инструкций для браузера о том, как найти его новое местоположение. Изменение доменов без перенаправления приведет к тому, что ваш сайт потеряет трафик от предыдущих посетителей.

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

Предположим, ваш веб-сайт настроен для обслуживания из одного домена с именем domain1.com, уже настроенного в Apache следующим образом:

<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>

Мы также предполагаем, что вы уже обслуживаете свою будущую версию веб-сайта по адресу domain2.com:

<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. Мы используем RedirectMatch вместо простого Redirect, чтобы гарантировать, что будут затронуты все страницы веб-сайта, а не только главная страница. Регулярное выражение ^/(.*)$ соответствует всему, что следует после / в URL-адресе. Например, http://domain1.com/index.html будет перенаправлен на http://domain2.com/index.html< /знак>. Чтобы добиться постоянного перенаправления, мы просто добавляем permanent после директивы RedirectMatch.

Примечание. Не забудьте перезапустить Apache после изменения конфигурации с помощью systemctl restart apache2.

Пример 2. Создание постоянного взаимодействия, несмотря на изменение имени отдельной страницы

Иногда необходимо изменить названия отдельных страниц, которые уже были опубликованы и получили трафик на вашем сайте. Изменение только имени приведет к ошибке 404 Not Found для посетителей, пытающихся получить доступ к исходному URL-адресу, но вы можете избежать этого, используя перенаправление. Это гарантирует, что люди, которые добавили ваши старые страницы в закладки или нашли их по устаревшим ссылкам в поисковых системах, по-прежнему попадут на нужную страницу.

Предположим, что на вашем веб-сайте есть две отдельные страницы для продуктов и услуг, которые называются 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 в директиве. Вы можете использовать столько перенаправлений, сколько хотите, чтобы ваши посетители не видели ненужных ошибок «Не найдено» при перемещении содержимого сайта.

Заключение

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

Существует множество других способов использования HTTP-перенаправлений, в том числе принудительное использование безопасных SSL-соединений (т. е. использование https вместо http) и обеспечение того, чтобы все посетители попадали только на www. префикс адреса веб-сайта.

Правильное использование перенаправлений позволит вам использовать свое текущее присутствие в Интернете, а также позволит вам изменить структуру вашего сайта по мере необходимости. Если вы хотите узнать больше о способах перенаправления посетителей, у Apache есть отличная документация по этому вопросу в разделах официальной документации mod_rewrite.