Как перенаправить www на не-www с помощью Apache в CentOS 7
Введение
Многим веб-разработчикам необходимо разрешить своим пользователям доступ к их веб-сайту или приложению как через поддомен www, так и через корневой домен (без www). То есть пользователи должны иметь одинаковый опыт при посещении www.my-website.com
и my-website.com
. Хотя есть много способов настроить это, наиболее дружественное к SEO решение — выбрать, какой домен вы предпочитаете — субдомен или корневой домен — и заставить веб-сервер перенаправлять пользователей, которые посещают другой, на предпочтительный домен.
Существует множество видов HTTP-перенаправлений, но в этом случае лучше всего использовать перенаправление 301, которое сообщает клиентам: «Запрошенный вами веб-сайт навсегда перемещен на другой URL-адрес. Вместо этого перейдите туда». Как только браузер получает код ответа HTTP 301 от сервера, он отправляет второй запрос на новый URL-адрес, предоставленный сервером, и пользователь получает доступ к веб-сайту, возможно, даже не замечая, что он был перенаправлен.
Почему бы не настроить свой веб-сервер так, чтобы он просто обслуживал один и тот же веб-сайт для запросов к обоим доменным именам? Это может показаться проще, но это не дает SEO-преимуществ переадресации 301. Постоянная переадресация сообщает сканерам поисковых систем, что для вашего веб-сайта существует одно каноническое местоположение, и это улучшает поисковый рейтинг этого единственного URL-адреса.
В этом руководстве вы настроите перенаправление 301 с помощью Apache в CentOS 7. Если вы используете Nginx вместо Apache, вместо этого см. это руководство: Как перенаправить www на не-www с помощью Nginx в CentOS 7.
Предпосылки
Чтобы выполнить этот урок, вам сначала нужно:
- Права суперпользователя на сервере с Apache. Если у вас еще нет такой настройки, следуйте нашему руководству по начальной настройке сервера с CentOS 7.
- Apache установлен и настроен для обслуживания вашего веб-сайта. Для этого следуйте этому руководству: Как установить веб-сервер Apache в CentOS 7.
- Зарегистрированное доменное имя. Если у вас его еще нет, вы можете получить его бесплатно из этой статьи из нашей документации, где показано, как это сделать.
Давайте начнем с настройки записей DNS.
Шаг 1 — Настройка записей DNS
Во-первых, вам нужно указать оба www.my-website.com
и my-website.com
на ваш сервер, на котором работает Apache. (В остальной части руководства предполагается, что ваш домен — my-website.com
. Замените его своим собственным доменом везде, где вы видите его ниже.) Вы сделаете это, создав DNS-запись A для каждого имени, которое указывает на IP-адрес вашего сервера Apache.
Откройте веб-консоль вашего провайдера DNS. В этом руководстве используется DigitalOcean DNS.
В форме «Добавить домен» введите зарегистрированное доменное имя в текстовое поле и нажмите «Добавить домен». Откроется страница нового домена, где вы сможете просматривать, добавлять и удалять записи для домена.
В разделе «Создать новую запись» введите \@” в текстовом поле HOSTNAME. Это специальный символ, указывающий, что вы добавляете запись для корневого доменного имени, запись для простого my-website.com
В текстовом поле WILL DIRECT TO введите публичный IPv4-адрес вашего сервера и нажмите «Создать запись» (TTL менять не нужно).
Для второй записи DNS вы можете использовать запись CNAME вместо записи A. Запись CNAME — это псевдоним, который указывает на другое имя вместо IP-адреса. Вы можете создать запись CNAME, которая направляет www.my-website.com
на my-website.com
, и любой HTTP-запрос для субдомена www попадет на ваш сервер. поскольку вы только что создали запись A для корневого домена. Но для простоты просто создайте еще одну запись A, подобную первой, введя \www в поле HOSTNAME и общедоступный IP-адрес сервера в поле WILL DIRECT TO.
Когда вы создали обе записи, это должно выглядеть примерно так:
При наличии двух записей веб-запросы как для my-website.com
, так и для www.my-website.com
должны достигать вашего сервера Apache. Теперь давайте настроим сервер.
Шаг 2 — Настройка перенаправления в Apache
Веб-сервер Apache предоставляет два модуля, помогающих настроить перенаправления: mod_alias
и mod_rewrite
. Хотя mod_rewrite
более мощный, mod_alias
проще понять и использовать. Если вам нужно перенаправить запросы, содержащие определенные строки запроса, например, или заголовки HTTP, вам нужно будет использовать mod_rewrite
. Многие выбирают mod_rewrite
из-за его возможностей сопоставления регулярных выражений, которых нет в mod_alias
. Но для простого случая перенаправления всех запросов для www.my-website.com
на my-website.com
mod_alias
подойдет. (Сам Apache рекомендует выбирать mod_alias
, когда это возможно, говоря, что выбор mod_rewrite
, когда это не нужно, «приводит к запутанным, хрупким и сложным в обслуживании конфигурациям».)
Модуль должен быть включен по умолчанию в CentOS 7, но для двойной проверки выполните следующую команду:
- httpd -M | grep alias_module
Если в выходных данных появляется alias_module (shared)
, модуль уже включен. Если нет, включите его, добавив эту строку в /etc/httpd/conf.modules.d/00-base.conf
:
- echo “LoadModule alias_module modules/mod_alias.so” | sudo tee -a /etc/httpd/conf.modules.d/00-base.conf
С включенным mod_alias
вы можете использовать директивы Redirect
, RedirectMatch
и другие, перечисленные в документах mod_alias
в вашем Конфигурация апача.
Теперь давайте настроим ваши VirtualHost
.
Как указано в предварительных требованиях, ваш веб-сайт уже должен быть настроен в Apache. Он может быть настроен в основном файле конфигурации Apache (/etc/httpd/conf/httpd.conf
) или, возможно, в собственном файле (например, /etc/httpd/conf.d/ my-website.com.conf
). Если для настройки VirtualHost
вы использовали руководство по установке Apache, указанное в разделе «Предварительные условия», оно может находиться в файле типа /etc/httpd/sites-available/my-website. com.conf
. Где бы ни был настроен ваш основной сайт, откройте этот файл в vi
или в вашем любимом редакторе (yum install nano
, если хотите):
- sudo vi /etc/httpd/conf/httpd.conf
Найдите все директивы ServerAlias
, установленные в VirtualHost
. Если вы найдете строку, для которой ServerAlias
установлен на www.my-website.com
, удалите эту строку. (Или, если эта строка содержит много псевдонимов в списке, разделенном запятыми, удалите из списка только www.my-website.com
.) Вам нужно удалить этот псевдоним потому что вы собираетесь создать отдельный VirtualHost
для поддомена, не содержащий ничего, кроме ServerName
и Redirect
. Основной VirtualHost
для сайта больше не будет обслуживать запросы для www.my-website.com
.
Теперь создайте VirtualHost
в отдельном файле (например, /etc/httpd/conf.d/www.my-website.com.conf
) :
- sudo vi /etc/httpd/conf.d/www.my-website.com.conf
Вставьте в файл следующее содержимое, заменив my-website.com
своим собственным доменным именем:
<VirtualHost *:80>
ServerName www.my-website.com
Redirect permanent / http://my-website.com/
</VirtualHost>
Сохраните и выйдите, когда закончите. Если вы создали этот файл в /etc/httpd/sites-available
, в соответствии с нашим руководством по установке Apache, создайте символическую ссылку на файл в /etc/httpd/sites-enabled/
:
- sudo ln -s /etc/httpd/sites-available/www.my-website.com.conf /etc/httpd/sites-enabled/
Этот новый VirtualHost
настраивает Apache для отправки переадресации 301 всем клиентам, запрашивающим www.my-website.com
, и направляет их на посещение my-website.com.
вместо этого. Перенаправление сохраняет URI запроса, поэтому запрос на http://www.my-website.com/login.php
будет перенаправлен на http://my-website.com. /логин.php
.
Примечание: если основной VirtualHost
вашего сайта содержит ServerAlias
с субдоменом с подстановочными знаками — *.my-website.com
— вам следует рассмотреть возможность его удаления и создайте новый VirtualHost
, подобный тому, который вы только что создали, для каждого субдомена, который вы хотите перенаправить. Если вы не хотите перенаправлять все поддомены и хотите, чтобы некоторые из них продолжали обслуживаться основным VirtualHost
, лучше явно назвать каждый поддомен псевдонимом, особенно теперь, когда у вас есть один поддомен. чьи запросы вы не хотите непреднамеренно сопоставлять с основным VirtualHost
. (Вы можете назвать каждый субдомен в отдельной строке ServerAlias
или указать их все в виде списка, разделенного запятыми, в одной строке ServerAlias
.)
Если вы должны сохранить ServerAlias
для *.my-website.com
, вам нужно убедиться, что Apache загружает новый www VirtualHost
перед основным one, потому что если основной загружается первым, Apache будет использовать его для обработки запросов на www.my-website.com
, поскольку это имя соответствует псевдониму с подстановочными знаками. Выполните следующую команду, чтобы увидеть, какой VirtualHost
будет загружен первым после перезапуска Apache:
- httpd -S
Найдите строки, содержащие namevhost my-website.com
и namevhost www.my-website.com
. Если строка www появляется первой, все готово. Однако, если VirtualHost
для корневого домена появляется первым, есть несколько способов заставить Apache сначала загрузить www:
- Если ваш основной
VirtualHost
содержится в файле (например,/etc/httpd/conf/httpd.conf
), который используетInclude
илиIncludeOptional
, чтобы включить каталог, содержащий ваш новый wwwVirtualHost
, просто переместите эту строкуInclude
над основнымVirtualHost
внутри файла. - Если ваш основной файл
VirtualHost
и ваш новый файл wwwVirtualHost
находятся в одном и том же каталоге (например,/etc/httpd/conf.d/
), вы можете заставить Apache сначала загрузить www, переименовав файлы и добавив некоторые числа к именам файлов. Добавьте01-
к имени файла wwwVirtualHost
(например,/etc/httpd/conf.d/01-www.my-website.com. conf
) и02-
в имя файла основногоVirtualHost
(например,/etc/httpd/conf.d/02-my- веб-сайт.com.conf
).
Запустите httpd -S
еще раз, чтобы убедиться, что www VirtualHost
появляется первым.
Когда будете готовы, перезапустите Apache:
- sudo systemctl restart httpd
Прежде чем посетить www.my-website.com
в своем браузере, сделайте запрос, используя curl
либо на своем сервере, либо на локальном компьютере (если curl
устанавливается локально):
- curl -IL http://www.my-website.com
Флаг -I
указывает curl
показывать только заголовки из ответа сервера. Флаг -L
указывает curl
подчиняться любым перенаправлениям с сервера, автоматически делая второй запрос, на этот раз по URL-адресу, указанному в Location
. заголовок (так же, как это сделал бы веб-браузер). Поскольку вы настроили перенаправление 301, curl
должен сделать два запроса, и вы должны увидеть только заголовки двух ответов:
OutputHTTP/1.1 301 Moved Permanently
Date: Tue, 03 Jan 2023 19:24:44 GMT
Server: Apache/2.4.53
Location: http://my-website.com/
Content-Type: text/html; charset=iso-8859-1
HTTP/1.1 200 OK
Date: Tue, 03 Jan 2023 19:24:44 GMT
Server: Apache/2.4.53
Last-Modified: Thu, 01 Dec 2022 22:10:57 GMT
ETag: "39-5eecb7ed6bfc9"
Accept-Ranges: bytes
Content-Length: 57
Content-Type: text/html; charset=UTF-8
В ответе 301 (перемещено навсегда) на исходный запрос к http://www.my-website.com
обратите внимание на предпоследний заголовок: Расположение: http://my- сайт.com
. Второй ответ исходит от последующего запроса curl
на URL-адрес, указанный в этом заголовке Location
, и, если ваш веб-сайт исправен, сервер должен был ответить 200 (ОК) .
Наконец, посетите http://www.my-website.com
в своем веб-браузере. Моргни, и ты пропустишь перенаправление. Ваш веб-сайт должен отображаться как обычно, но еще раз взгляните в адресную строку и обратите внимание, что в URL-адресе отсутствует \www. >http://мой-сайт.com.
Заключение
В этом руководстве вы добавили две записи DNS для своего веб-сайта и настроили Apache для перенаправления дополнительного домена на ваш предпочтительный домен. Теперь ваш сайт доступен через оба домена. Возможно, это уже было до того, как вы прочитали этот урок; возможно, вы обслуживали его напрямую с обоих доменных имен. Но с помощью всего лишь четырех строк конфигурации Apache вы улучшили репутацию своего веб-сайта в глазах поисковых систем и, таким образом, представили его большему количеству пользователей в Интернете.
Хотите узнать о более мощном модуле mod_rewrite
? Ознакомьтесь с нашим руководством Как переписать URL-адреса с помощью mod_rewrite для Apache в Ubuntu 22.04.