
Перенаправления Apache полезны в самых разных ситуациях. Среди прочего, вы можете использовать удобные редиректы, чтобы направить посетителей с HTTP на HTTPS (Apache http to https redirect) версию вашего сайта, перенаправить трафик с www на не www URL, или даже изменить имена сайтов и каталогов. Мы поможем вам понять и настроить перенаправления Apache на CentOS и Ubuntu.
- 301 или 302 редирект: в чем разница?
- Перенаправления Apache301: Основы
- Простое перенаправление URL
- Apache: Перенаправление каталога
- Перенаправлять с www на не-www домены.
- Сложные перенаправления Apache с mod_rewrite.
- Включение mod_rewrite на CentOS
- Включение mod_rewrite на Ubuntu
- Создание файла .htaccess для перенаправления Apache
- Перенаправление нескольких доменов на один и тот же URL с помощью Apache redirect
- Apache: Перенаправление с HTTP на HTTPS: как это работает
- Переименование веб-страниц и перемещение каталогов
- Краткое изложение наиболее важной информации о mod_rewrite
- В чем разница между RewriteRule и redirect?
301 или 302 редирект: в чем разница?
При рассмотрении редиректов важно различать 301 и 302 редиректы. Первый код статуса (301) означает постоянное перенаправление, а второй (302) — временное.
301-й редирект гораздо более желателен с точки зрения SEO. Если поисковая система находит такой редирект, она понимает, что это постоянный редирект. По этой причине он не только отмечает новый URL, но и инициирует процесс переноса любого значения Page Rank со старого URL на новый — таким образом, сохраняется уже достигнутый SEO-рейтинг.
С другой стороны, если краулер обнаруживает перенаправление 302, он отмечает новый адрес и идет дальше. В зависимости от краулера, он может пометить URL для повторного посещения в будущем. Это происходит потому, что перенаправление 302 должно указывать на то, что перенаправление временное и «настоящий» URL вскоре вернется в сеть.
При создании перенаправления всегда указывайте, что это 301 перенаправление. Во многих ситуациях перенаправления по умолчанию принимают значение 302, если тип перенаправления не указан.
Перенаправления Apache301: Основы
Если вам нужно перенаправить только один URL или небольшое количество URL, вы можете легко разметить их по отдельности в конфигурационном файле Apache вашего проекта.
Простое перенаправление URL
Для одного 301 редиректа используйте директиву redirect в конфигурационном файле Apache. Синтаксис для этого выглядит следующим образом:
Redirect 301 [old URL] [new URL]
Новый URL также может быть внешним URL. Таким образом, пользователям можно сообщать, например, привлекательный URL example.com/store вместо того, чтобы отправлять длинный и сложный URL страницы магазина Amazon. Следующий пример перенаправляет трафик с example.com/store на страницу магазина Amazon следующим образом:
Redirect 301 example.com/store https://www.amazon.com/s?marketplaceID=..
Директива Apache redirect всегда должна быть включена в командный блок VirtualHost в основном конфигурационном файле веб-сервера. По умолчанию этот файл можно найти в следующих местах:
- CentOS: /etc/httpd/conf.d/example.com.conf
- Ubuntu: /etc/apache2/sites-available/example.com.conf
Расположение и имя файла конфигурации Apache может отличаться — в зависимости от того, как вы или ваш администратор сервера настроили хостинг.
Отредактируйте этот файл с помощью редактора по вашему выбору, например, редактора командной строки nano.
CentOS:
sudo nano /etc/httpd/conf.d/example.com.conf
Ubuntu:
sudo nano /etc/apache2/sites-available/example.com.conf
Прокрутите файл, пока не найдете командный блок VirtualHost, который выглядит примерно так:
<VirtualHost *:80>
ServerName example.com
<Directory "/var/www/example.com/html">
AllowOverride All
</Directory>
</VirtualHost>
Теперь добавьте директиву Apache redirect в командный блок VirtualHost. При этом убедитесь, что директива находится вне командных блоков каталогов:
<VirtualHost *:80>
ServerName example.com
Redirect 301 /blog https://blog.example.com
<Directory "/var/www/example.com/html">
AllowOverride All
</Directory>
</VirtualHost>
Сохраните и закройте файл, затем перезапустите Apache, чтобы изменения вступили в силу:
CentOS:
sudo systemctl restart httpd
Ubuntu:
sudo service apache2 restart
Apache: Перенаправление каталога
Таким же образом можно перенаправить подкаталог текущего сайта. Например, предположим, вы хотите переместить блог вашего сайта из подкаталога (‘http://example.com/blog’) в собственный канонический домен (‘http://blog.example.com’). Политика перенаправления Apache будет такой:
Redirect 301 /blog https://blog.example.com
Перенаправлять с www на не-www домены.
Обычно перенаправление www-версии URL на не www-версию (или наоборот) осуществляется с помощью строки «ServerAlias» в конфигурационном файле Apache. Хотя этот подход хорошо работает с точки зрения посетителей, он не считается «лучшей практикой» с точки зрения SEO. Это связано с тем, что использование «ServerAlias» вместо 301 редиректа несет в себе риск того, что рассматриваемый контент может быть отмечен как дублированный. В целом, однако, с точки зрения SEO нет никакой разницы между www и не www версиями URL. Главное, чтобы вы выбрали один из них.
Далее мы перенаправим трафик с www на не-www вариант. Опять же, нам понадобится основной конфигурационный файл Apache, который вы снова открываете с помощью редактора по вашему выбору — например, редактора командной строки nano.
CentOS:
sudo nano /etc/httpd/conf.d/example.com.conf
Ubuntu:
sudo nano /etc/apache2/sites-available/example.com.conf
В командном блоке найдите следующую строку (с индивидуальным доменом вашего проекта):
ServerAlias www.example.com
Удалите эту строку и прокрутите файл до конца. Добавьте туда следующий новый командный блок «VirtualHost»:
<VirtualHost *:80>
ServerName www.example.com
Redirect 301 / https://example.com/
</VirtualHost>
Сохраните и закройте файл. Затем перезапустите Apache, чтобы изменения вступили в силу.
Сложные перенаправления Apache с mod_rewrite.
Для более сложных 301 перенаправлений лучше всего использовать модуль Apache mod_rewrite. Этот модуль быстрый, гибкий и мощный — он дает вам возможность манипулировать URL-адресами простым способом. Вы можете определить соответствующие правила в файле .htaccess.
Включение mod_rewrite на CentOS
В CentOS модуль mod_rewrite включен по умолчанию. Если вы обнаружили, что он не был включен, вы можете включить его в любое время в базовом конфигурационном файле модуля. Для этого сначала откройте файл редактором nano:
sudo nano /etc/httpd/conf.modules.d/00-base.conf
Добавьте следующую строку или включите ее, если она была закомментирована:
LoadModule rewrite_module modules/mod_rewrite.so
На следующем этапе включите использование файлов .htaccess. Для этого откройте основной файл конфигурации Apache.
sudo nano /etc/httpd/conf.d/example.com.conf
Прокрутите вниз до основного командного блока VirtualHost, который должен выглядеть примерно так, как указано ниже:
<VirtualHost *:80>
ServerName example.com
<Directory "/var/www/example.com/html">
AllowOverride None
</Directory>
</VirtualHost>
Измените запись для «AllowOverride» с «None» на «All»:
AllowOverride All
Если запись каталога отсутствует в командном блоке VirtualHost, добавьте ее вручную:
<Directory "/var/www/example.com/html">
AllowOverride All
</Directory>
Убедитесь, что вы используете правильный путь к корневому каталогу вашего сайта.
Сохраните и выйдите из файла. Перезапустите Apache, чтобы изменения вступили в силу:
sudo systemctl restart httpd
Включение mod_rewrite на Ubuntu
Чтобы включить mod_rewrite на сервере Ubuntu, выполните следующую команду:
sudo a2enmod rewrite
Перезапустите Apache, чтобы изменения вступили в силу:
sudo service apache2 restart
Далее разрешите использование файлов .htaccess. Для этого отредактируйте основной конфигурационный файл Apache:
sudo nano /etc/apache2/sites-available/example.com.conf
Прокрутите вниз до основного командного блока VirtualHost и найдите командный блок директории (Directory), который должен выглядеть примерно так:
<Directory /var/www/example.com/html/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
В строке «AllowOverride» замените запись по умолчанию «None» на «All»:
AllowOverride All
Если запись каталога отсутствует в командном блоке VirtualHost, добавьте ее вручную:
<Directory /var/www/example.com/html/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Сохраните и выйдите из файла. Перезапустите веб-сервер, чтобы изменения вступили в силу:
sudo service apache2 restart
Создание файла .htaccess для перенаправления Apache
После настройки Apache на использование mod_rewrite и разрешение файлов .htaccess, пришло время перейти в каталог документов вашего сайта (корневой каталог) и создать файл .htaccess.
Вам не нужно перезапускать Apache после внесения изменений в файл .htaccess.
Если вы не внесли никаких изменений, перейдите непосредственно в корневой каталог вашего веб-сервера Apache, набрав следующее:
cd /var/www/html
В каталоге теперь создайте файл .htaccess и откройте его следующей командой:
sudo nano .htaccess
Укажите ваши индивидуальные конфигурации mod_rewrite. Начните с простого теста, чтобы убедиться, что все работает правильно, добавив в этот файл следующие строки:
RewriteEngine on
RewriteRule ^hello.html$ goodbye.html
Это правило перенаправляет запросы на hello.html на страницу goodbye.html. Сохраните и выйдите из файла, а затем создайте два HTML-документа с помощью следующих команд:
sudo echo "Hello" >> hello.html
sudo echo "Goodbye" >> goodbye.html
Теперь откройте страницу hello.html в браузере. Вы должны быть перенаправлены на страницу goodbye.html с помощью перенаправления Apache и увидеть сообщение «Goodbye».
Перенаправление нескольких доменов на один и тот же URL с помощью Apache redirect
Существует несколько причин, по которым вам необходимо перенаправить разные домены на один и тот же адрес:
- Если ваш основной сайт — example.com, то лучше всего захватить пространство имен, купив example.net и example.org.
- Имеет смысл также зарегистрировать типичные неправильные написания вашего доменного имени, такие как exampl.com или exmple.com, и включить их в свою стратегию. Таким образом вы защитите себя от так называемого опечатывания.
- Вы также можете просто владеть вариантами своего доменного имени, такими как the-example.com или my-example.com, которые также должны приводить посетителей на ваш веб-проект.
Хотя вы можете перенаправить эти доменные имена на вашу главную страницу обычным способом, с точки зрения SEO рекомендуется установить 301 редирект для достижения поставленных целей.
Чтобы перенаправить несколько доменов на один домен с помощью Apache redirect, сначала включите модуль mod_rewrite, как описано в предыдущем разделе, и создайте соответствующий файл .htaccess. Затем добавьте следующие строки в файл .htaccess:
RewriteEngine on
RewriteCond %{HTTP_Host} ^(www.)?example.net$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301]
В примере трафик перенаправляется с example.net на example.com. Теперь просто настройте это правило в соответствии с вашими доменными именами и желаемыми результатами. Например, чтобы перенаправить трафик на www-версию URL (www.example.com), вы должны использовать следующее:
RewriteEngine on
RewriteCond %{HTTP_Host} ^(www.)?example.net$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301]
Apache: Перенаправление с HTTP на HTTPS: как это работает
Для безопасности ваших пользователей и рейтинга в поисковых системах крайне важно, чтобы весь трафик на вашем сайте был защищен с помощью SSL/TLS. Также для этого случая вы можете использовать 301 редирект Apache, который автоматически перенаправляет посетителей на HTTPS-версию ваших страниц.
Опять же, сначала настройте mod_rewrite и файл .htaccess, а затем добавьте следующие строки в файл конфигурации:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://example.com$1 [R=301,L]
Переименование веб-страниц и перемещение каталогов
Бывают ситуации, когда необходимо переименовать существующую страницу или каталог. Это приведет к разрушению всех ссылок, указывающих на эту страницу, что не только ухудшит пользовательский опыт, но и повлияет на SEO.
Используйте следующие правила в файле .htaccess (после настройки mod_rewrite и файлов .htaccess).
Переименовать веб-страницу:
RewriteEngine on
RewriteRule ^old-page.html$ /new-page.html [R=301]
Переименовать каталог:
RewriteEngine on
RewriteRule ^old-directory/ /new-directory/ [R=301]
В приведенных выше примерах имена файлов и каталогов указаны как пути относительно корневого каталога сайта. Существует три варианта пути:
- полный путь к файловой системе, например /var/www/html/new-page.html
- веб-путь относительно корневого каталога, например /new-page.html
- абсолютный URL, например ‘http://example.com/new-page.html’.
Краткое изложение наиболее важной информации о mod_rewrite
Модуль mod_rewrite использует регулярные выражения для подбора и замены URL-адресов. Чтобы включить mod_rewrite, первая строка правил в файле .htaccess всегда должна выглядеть следующим образом:
RewriteEngine on
Сердцем mod_rewrite являются RewriteRules. Каждое правило RewriteRule состоит из трех частей:
RewriteRule [pattern] [substitution] [flags]
Шаблон создается с помощью регулярных выражений. Могут быть сделаны следующие замены:
- полный путь к файловой системе
- веб-путь относительно корневого каталога
- абсолютный URL
Флаги являются необязательными. Некоторые из наиболее распространенных флагов следующие:
- L: указывает, что это последнее в серии правил.
- R=301: принудительное 301 перенаправление
- NC: игнорирует чувствительность к регистру, поэтому правило не чувствительно к регистру.
Полный список доступных флагов можно найти на официальном сайте Apache.
В некоторых случаях правило RewriteRule дополняется параметром RewriteCond. Он определяет условия, при которых правило RewriteRule вступает в силу.RewriteCond также состоит из трех частей:
RewriteCond [test string] [condition] [flags]
Тестовая строка обычно представляет собой переменную сервера в формате %{НАЗВАНИЕ ПЕРЕМЕННОЙ}.
Существует три типа условий:
- регулярные выражения
- сравнения строк
- проверка файла/пути
Флаги в данном случае опять же необязательны. Для RewriteCond доступны три флага:
- NC: игнорирует регистр, поэтому условие не чувствительно к регистру
- OR: логическое «или»
- NV («No Vary»): имя заголовка не будет включено в заголовок ответа Vary.
В чем разница между RewriteRule и redirect?
И RewriteRule, и Apache 301 Redirect могут быть выделены в файле .htaccess для перенаправления трафика сайта.
Основное различие заключается в том, что RewriteRule реализуется модулем mod_rewrite, а redirect — модулем mod_alias.
mod_rewrite | mod_alias |
---|---|
использует RewriteRule и RewriteCond | использует Redirect и RedirectMatch |
очень универсален, так как использует регулярные выражения для подбора и замены URL | не очень настраиваемый |
может быть сложным в использовании | прост в использовании |
может быть не установлен или не включен по умолчанию | включен по умолчанию в большинстве установок Apache |