Как перенаправить www на не-www с помощью Nginx в CentOS 7
Введение
Многим веб-разработчикам необходимо разрешить своим пользователям доступ к их веб-сайту или приложению как через поддомен www, так и через корневой домен (без www). То есть пользователи должны иметь одинаковый опыт при посещении www.my-website.com
и my-website.com
. Хотя есть много способов настроить это, наиболее дружественное к SEO решение — выбрать, какой домен вы предпочитаете — субдомен или корневой домен — и заставить веб-сервер перенаправлять пользователей, которые посещают другой, на предпочтительный домен.
Существует множество видов HTTP-перенаправлений, но в этом случае лучше всего использовать перенаправление 301, которое сообщает клиентам: «Запрошенный вами веб-сайт навсегда перемещен на другой URL-адрес. Вместо этого перейдите туда». Как только браузер получает код ответа HTTP 301 от сервера, он отправляет второй запрос на новый URL-адрес, предоставленный сервером, и пользователь получает доступ к веб-сайту, возможно, даже не замечая, что он был перенаправлен.
Почему бы не настроить свой веб-сервер так, чтобы он просто обслуживал один и тот же веб-сайт для запросов к обоим доменным именам? Это может показаться проще, но это не дает SEO-преимуществ переадресации 301. Постоянная переадресация сообщает сканерам поисковых систем, что для вашего веб-сайта существует одно каноническое местоположение, и это улучшает поисковый рейтинг этого единственного URL-адреса.
В этом руководстве вы настроите перенаправление 301 с помощью Nginx в CentOS 7. Если вы используете Apache вместо Nginx, вместо этого см. это руководство: Как перенаправить www на не-www с помощью Apache в CentOS 7.
Предпосылки
Чтобы выполнить этот урок, вам сначала нужно:
- Права суперпользователя (пользователя в группе
wheel
) на сервере, на котором работает Nginx. Если у вас еще нет такой настройки, следуйте этому руководству: Initial Server Setup with CentOS 7. - Nginx установлен и настроен для обслуживания вашего веб-сайта. Следуйте этому руководству, чтобы сделать это: Как установить Nginx на CentOS 7.
- Зарегистрированное доменное имя. Если у вас его еще нет, вы можете получить его бесплатно из этой статьи из нашей документации, где показано, как это сделать.
Давайте начнем с настройки записей DNS.
Шаг 1 — Настройка записей DNS
Во-первых, вам нужно указать оба www.my-website.com
и my-website.com
на ваш сервер, на котором работает Nginx. (В остальной части руководства предполагается, что ваш домен — my-website.com
. Замените его своим собственным доменом везде, где вы видите его ниже.) Вы сделаете это, создав DNS-запись A для каждого имени, которое указывает на IP-адрес вашего сервера Nginx.
Откройте веб-консоль вашего провайдера 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
должны достигать вашего сервера Nginx. Теперь давайте настроим сервер.
Шаг 2 — Настройка редиректа в Nginx
Как указано в предварительных требованиях, ваш веб-сайт уже должен быть настроен в Nginx. Неважно, находится ли блок server
сайта в основном файле /etc/nginx/nginx.conf
или в собственном файле. Важно то, что у вас есть некоторый блок server
, настроенный с директивой server_name
, установленной на my-website.com
и/или www .my-website.com
. Независимо от того, содержит ли ваше имя_сервера
одно или оба имени, сейчас самое время решить, какое имя вы хотите использовать в качестве единственного имени для размещения сайта.
Откройте файл, содержащий конфигурацию вашего веб-сайта (например, /etc/nginx/conf.d/my-website.com.conf
) в vi
или в вашем любимом редакторе (yum install nano
, если хотите) и найдите директиву server_name
:
- sudo vi /etc/nginx/conf.d/my-website.com.conf
server {
. . .
server_name my-website.com www.my-website.com
. . .
}
Если вы хотите перенаправить www.my-website.com
на my-website.com
, удалите www.my-website.com
из server_name
, сохраните и закройте файл. (Если вы хотите перенаправить my-website.com
на www.my-website.com
, вместо этого удалите my-website.com
.)
Затем создайте новый файл конфигурации Nginx с именем /etc/nginx/conf.d/www.my-website.com.conf
(или /etc/nginx/conf.d/my- веб-сайт.com.conf
, если это имя, которое вы перенаправляете). Назовите файл как угодно, но, как и все файлы конфигурации Nginx, имя файла должно заканчиваться на .conf
:
- sudo vi /etc/nginx/conf.d/www.my-website.com.conf
Добавьте в файл следующий блок server
, заменив my-website.com
своим собственным доменным именем:
server {
server_name www.my-website.com;
return 301 $scheme://my-website.com$request_uri;
}
Если вместо этого вы перенаправляете my-website.com
на субдомен www, поместите my-website.com
только в server_name
, а www.my-website.com
в URL-адресе на следующей строке.
Сохраните и выйдите, когда закончите.
Это настраивает Nginx на отправку переадресации 301 всем клиентам, запрашивающим www.my-website.com
, и вместо этого направляет их на посещение my-website.com
. Перенаправление сохраняет URI запроса, поэтому запрос на http://www.my-website.com/login.php
будет перенаправлен на http://my-website.com. /логин.php
.
Примечание. Блок server
выше не содержит директивы listen
. Это нормально, потому что, как упоминалось в этом руководстве, любой блок server
без директивы listen
будет прослушивать 0.0.0.0:80 (порт 80 на всех интерфейсах). Но если ваш сервер Nginx содержит несколько IP-адресов или если ваш сайт прослушивает порт, отличный от 80, вам может потребоваться добавить директиву listen
, чтобы указать конкретный IP-адрес и порт. Используйте то же значение для listen
, которое использует основной блок вашего сайта server
.
Перед применением изменений убедитесь, что ваша конфигурация Nginx не содержит ошибок:
- sudo nginx -t
Если вы не допустили синтаксическую ошибку (например, забыли точку с запятой), конфигурация должна быть в порядке.
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Теперь перезапустите Nginx, чтобы применить новое правило перенаправления:
- sudo systemctl restart nginx
Прежде чем посетить 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
Server: nginx/1.20.1
Date: Thu, 08 Dec 2022 19:24:44 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: http://my-website.com
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Thu, 08 Dec 2022 19:24:44 GMT
Content-Type: text/html
Content-Length: 57
Last-Modified: Thu, 01 Dec 2022 22:10:57 GMT
Connection: keep-alive
ETag: "63892671-39"
Accept-Ranges: bytes
В ответе 301 (перемещено навсегда) на первоначальный запрос к http://www.my-website.com
обратите внимание на последний заголовок: Местоположение: http://my-website. ком
. Второй ответ исходит от последующего запроса curl
к http://my-website.com
, и если ваш веб-сайт исправен, сервер должен был ответить 200 ( ХОРОШО).
Наконец, посетите http://www.my-website.com
в своем веб-браузере. Моргни, и ты пропустишь перенаправление. Ваш веб-сайт должен отображаться как обычно, но еще раз взгляните в адресную строку и обратите внимание, что в URL-адресе отсутствует \www. >http://мой-сайт.com.
Заключение
В этом руководстве вы добавили две записи DNS для своего веб-сайта и настроили Nginx для перенаправления дополнительного домена на ваш предпочтительный домен. Теперь ваш сайт доступен через оба домена. Возможно, это уже было до того, как вы прочитали этот урок; возможно, вы обслуживали его напрямую с обоих доменных имен. Но с помощью всего лишь четырех строк конфигурации Nginx вы улучшили репутацию своего веб-сайта в глазах поисковых систем и, таким образом, представили его большему количеству пользователей в Интернете.
Хотите узнать больше о том, как Nginx решает, какой блок server
будет обрабатывать данный запрос? Ознакомьтесь с этим руководством: Понимание алгоритмов выбора Nginx Server и Location Block.