Введение
Когда ваш веб-сайт или приложение запущено и работает с доменом, часто предпочтительнее разрешить пользователям доступ к нему либо через простое доменное имя, либо через www. Несмотря на то, что существует множество способов его настройки, лучше всего из соображений согласованности и SEO выбрать, какой домен вы предпочитаете, простой или www, и перенаправить другой на ваш предпочтительный домен. Этот тип перенаправления называется постоянным перенаправлением или «перенаправлением 301», и его можно легко настроить, правильно настроив записи ресурсов DNS и веб-сервер.
В этом руководстве показано, как перенаправить URL-адрес с www на не-www и наоборот, например, с www.example.it на example.it с помощью Apache в Ubuntu 18.04.
Предпосылки
В этом руководстве предполагается, что у вас есть привилегии суперпользователя — sudo или root — на сервере, на котором работает Apache. Если вы еще не настроили его, следуйте этому руководству: Ubuntu 18.04 LTS Initial Setup.
Предполагается, что Apache установлен. Если он не установлен, следуйте этому руководству: Как установить LAMP (Apache MySQL PHP) на Ubuntu 18.04 LTS.
Также необходимо иметь активное и работающее доменное имя. Если записи DNS уже активны и правильно настроены, пропустите следующий абзац.
Настройка DNS-записей
Чтобы установить желаемое перенаправление с www.example.it на example.it или наоборот, вам необходимо иметь запись A для каждого имени.
Имя хоста должно быть вашим доменом, например .it, а IP-адрес должен быть установлен на общедоступный IP-адрес вашего сервера Apache. Это автоматически создаст запись A, которая указывает ваш домен на указанный IP-адрес.
Затем добавьте еще одну запись A с « www » в качестве имени хоста (или «www.example.it», если только «www» не работает) и укажите тот же IP-адрес.
Примечание. Это также будет работать с записями CNAME, если запись A канонического имени относится к IP-адресу веб-сервера Apache.
Теперь ваш сервер должен быть доступен через домен www, а не через www, но нам все еще нужно настроить перенаправление.
Включить модуль перезаписи
Чтобы выполнить перенаправление 301, мы будем использовать модуль Apache mod_rewrite. Таким образом, пользователи смогут получить доступ к вашему сайту с префиксом www или без него и будут перенаправлены на домен по своему выбору.
Сначала включите модуль mod_rewrite с помощью этой команды:
sudo a2enmod rewrite
Перезапустите Апач:
sudo service apache2 restart
С включенным модулем перезаписи мы можем настроить Apache с правилами перенаправления, используя файл .htaccess или вставив правила перенаправления непосредственно в файл конфигурации Apache.
Давайте сначала посмотрим, как настроить правила перенаправления непосредственно в файле конфигурации Apache. Если вы хотите использовать файл.htaccess для установки правил перенаправления, пропустите следующий абзац.
Перенаправление с помощью файла Apache.conf — 1-й метод
Давайте посмотрим, как создать правила перенаправления в файле конфигурации Apache без необходимости включать и создавать файл htaccess.
Откройте файл конфигурации Apache:
sudo nano /etc/apache2/sites-enabled/000-default.conf
Файл должен выглядеть так:
<VirtualHost *:80>...
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html...
ServerName TUO_NOME_DOMINIO.it
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined...
</VirtualHost>
Добавьте следующие строки кода перед закрытием тега </Virtualhost>, чтобы установить перенаправление с www на не-www:
RewriteEngine On
RewriteBase /RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Найдите DocumentRoot вашего сайта и запишите его. По умолчанию корневая папка (DocumentRoot ) — это /var/www/html, поэтому мы будем использовать этот каталог в нашем примере конфигурации.
Добавьте следующую директиву Directory в конец файла и обязательно замените DocumentRoot своим каталогом (если он отличается), в противном случае оставьте следующее:
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
Итак, результат будет выглядеть так:
<VirtualHost *:80>...
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html...
ServerName TUO_NOME_DOMINIO.it
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined...
RewriteEngine On
RewriteBase /RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
</VirtualHost>
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
Перезапустите Апач:
sudo service apache2 restart
Если вы хотите сделать обратную переадресацию, то есть с не-www на www, измените строки кода следующим образом:
RewriteEngine On
RewriteBase /RewriteCond %{HTTP_HOST}!^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Затем перезапустите Апач:
sudo service apache2 restart
На этом этапе перенаправление для Apache должно работать правильно, без использования файла.htaccess.
Если вы используете SSL-сертификаты, значит у вас активное соединение с протоколом HTTPS и вы хотите перенаправить с www на не-www (или наоборот) и с HTTP на HTTPS, рекомендую использовать htaccess (2-й способ, следующий абзац).
Включить файл.htaccess — 2-й способ
Если вы следовали предыдущему методу, у вас уже должна быть правильно настроенная переадресация, и вам не нужно читать дальше. Если вы хотите использовать файл.htaccess для настройки перенаправления, продолжайте чтение.
Чтобы включить.htaccess, откройте файл конфигурации Apache. В Ubuntu файл конфигурации по умолчанию находится в /etc/apache2/sites-enabled/000-default.conf, поэтому откройте файл:
sudo nano /etc/apache2/sites-enabled/000-default.conf
Найдите DocumentRoot вашего сайта и запишите его. По умолчанию корневая папка (DocumentRoot ) — это /var/www/html, поэтому мы будем использовать этот каталог в нашем примере конфигурации.
Добавьте следующую директиву Directory в конец файла и обязательно замените DocumentRoot своим каталогом (если он отличается), в противном случае оставьте следующее:
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
Сохраните и закройте файл, нажав CTRL + X, затем Y, чтобы сохранить изменения, а затем ENTER, если вы используете nano.
Теперь файл конфигурации должен выглядеть так:
<VirtualHost *:80>...
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ServerName example.it
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined...
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
Теперь перезапустите Apache, чтобы изменения вступили в силу:
sudo service apache2 restart
Apache настроен на чтение файлов .htaccess, расположенных в любом месте каталога /var/www/html. Теперь давайте добавим правила перезаписи для редиректа.
Теперь создайте или отредактируйте файл.htaccess, чтобы включить правила перенаправления. Переместим каталоги в DocumentRoot, в нашем случае /var/www/html:
cd /var/www/html
Давайте создадим или изменим файл .htaccess:
sudo nano.htaccess
Конечно, если вы еще не создали файл, он будет пустым. Теперь давайте настроим редирект с www на без www или с без www на www.
Редирект с www на без www
Если вы хотите перенаправить пользователей с www на без www, введите следующую конфигурацию:
RewriteEngine On
RewriteBase /RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Сохраните и закройте файл, нажав CTRL + X, затем Y, чтобы сохранить изменения, а затем ENTER, если вы используете nano.
Изменения должны вступить в силу немедленно. Если вы используете HTTPS, вам нужно изменить правила следующим образом:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
Редирект с не-www на www
Если вы хотите перенаправить пользователей с не-www на www, введите следующую конфигурацию:
RewriteEngine On
RewriteBase /RewriteCond %{HTTP_HOST}!^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Сохраните и закройте файл, нажав CTRL + X, затем Y, чтобы сохранить изменения, а затем ENTER, если вы используете nano.
Изменения должны вступить в силу немедленно. Если вы используете HTTPS, вам нужно изменить правила следующим образом:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST}!^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
Вывод
В этом руководстве мы узнали, как настроить правила перенаправления для Apache2 с www на не-www и наоборот, а также для http на https. Мы видели два разных метода: прямое использование файла конфигурации Apache2 и использование файла.htaccess.
Это все! Перенаправление Apache теперь настроено правильно.