Перейти к содержимому

Посетители проходят через несколько перенаправлений до страницы

Предупреждение Весь домен Безопасность

Общие инструкции. Откройте эту статью из своего отчёта PageCheck, чтобы увидеть её заполненной цепочками перенаправлений, найденными на вашем сайте, и правилом для вашего хостинга (Cloudflare, Plesk, cPanel, Apache или nginx).

Что это такое

У сайта четыре корневых адреса: с www и без, по http:// и по https://. Посетители вводят любой из них, старые ссылки и результаты поиска ведут на любой из них. Только один отдаёт страницу; остальные три должны отправлять посетителя туда одним постоянным перенаправлением (301) — прямо на адрес https:// и никогда через http:// по пути.

Каждое лишнее перенаправление — это полное обращение к серверу и обратно, прежде чем страница вообще начнёт загружаться, а Google просит не более одного. Переход с https:// обратно на http:// ставит нового посетителя на незашифрованное соединение, которое любой в той же сети может прочитать или перенаправить.

Что не так

Один или несколько корневых адресов проходят два и более перенаправления до страницы, идут по пути через незашифрованный http://, используют временное перенаправление, заканчиваются на другом сайте или вообще не доходят до страницы.

Как исправить

1. Определите единственный конечный адрес и убедитесь, что HTTPS работает на каждом имени. Страница отдаётся по адресу https://example.com, так что именно на него должны указывать все остальные. Прежде чем добавлять перенаправления, откройте https:// на другом имени (www.example.com) в браузере: предупреждения о сертификате быть не должно. Сертификаты Let's Encrypt и Cloudflare покрывают оба имени, когда оба указаны; если одного не хватает, сначала добавьте его в сертификат, иначе каждое перенаправление с этого имени будет начинаться с предупреждения.

2. Настройте одно постоянное перенаправление с каждого из остальных корневых адресов прямо на конечный. Используйте правило для того места, где отвечает ваш сайт (хостинг подскажет): одно правило, которое обрабатывает схему и www за один шаг, а не два правила одно за другим. Используйте 301, никогда 302 или 307, и сохраняйте путь и строку запроса.

Apache или LiteSpeed (также хостинги Plesk и cPanel с Apache): в файле .htaccess в главной папке сайта, над строкой «# BEGIN WordPress»

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]

nginx: блоки server сайта

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.example.com;
    # the certificate must cover www.example.com
    return 301 https://example.com$request_uri;
}

Cloudflare, если сайт находится за ним: Rules → Redirect Rules → Create rule

When incoming requests match (custom filter expression):
    http.host eq "www.example.com"

Then: Dynamic redirect, status code 301, preserve query string:
    concat("https://example.com", http.request.uri.path)
  • Plesk: Websites & Domains → Hosting Settings: установите «Preferred domain» в выбранную форму (https://example.com) и отметьте «Permanent SEO-safe 301 redirect from HTTP to HTTPS». Тогда Plesk отправляет каждый остальной корневой адрес на конечный за один шаг.
  • cPanel: Domains → Redirects: постоянное (301) перенаправление с подстановочным знаком с другого имени на конечный адрес, «Redirect with or without www», — или правило .htaccess выше.
  • Если CDN или балансировщик нагрузки завершает HTTPS перед сервером, сервер видит незашифрованный http://, и правило .htaccess выше зацикливается. Проверяйте заголовок «X-Forwarded-Proto» вместо %{HTTPS} или задайте перенаправление на стороне CDN, как с Cloudflare.
  • После этого удалите все остальные правила перенаправления для этих адресов (старый плагин «принудительный HTTPS», второе перенаправление в панели управления): именно два правила дают два перехода.

3. Скажите браузерам использовать https:// с самого начала. Когда https:// работает на обоих именах, отправляйте заголовок Strict-Transport-Security: max-age=31536000; includeSubDomains на обоих. Браузер, однажды посетивший сайт, больше никогда не пробует http://, так что для вернувшихся посетителей переход через http:// исчезает. Добавляйте «preload» и отправляйте домен на hstspreload.org только когда каждый поддомен работает по HTTPS.

4. Проверьте. Запросите у каждого корневого адреса его первый ответ: все, кроме конечного адреса, должны отвечать 301 с конечным адресом в «location», а конечный адрес должен отвечать 200:

В терминале

curl -sI http://www.example.com/ | grep -i '^HTTP\|^location'
curl -sI https://www.example.com/ | grep -i '^HTTP\|^location'
curl -sI http://example.com/ | grep -i '^HTTP\|^location'
curl -sI https://example.com/ | grep -i '^HTTP\|^location'

Затем запустите эту проверку снова: она проходит все четыре адреса и перечисляет каждый переход.

Make every root address of my website reach the page in one permanent redirect: http://www.example.com/, https://www.example.com/ and http://example.com/ must each answer 301 straight to https://example.com (same path and query), never via http:// on the way, and https://example.com/ must answer 200.
The site is not known to be behind a CDN.

Steps:
1. Make sure the certificate covers example.com and www.example.com (no warning on https:// for either name).
2. Replace all existing redirect rules for these addresses with ONE rule that handles scheme and host in the same step: on Cloudflare a Single Redirect `http.host eq "www.example.com"` → `concat("https://example.com", http.request.uri.path)` (301, preserve query string) with Always Use HTTPS left on; on Apache/LiteSpeed a RewriteCond %{HTTPS} off [OR] / RewriteCond %{HTTP_HOST} ^www\.example\.com$ / RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L] block above # BEGIN WordPress; on nginx a port-80 server block for both names and a port-443 block for www.example.com, each `return 301 https://example.com$request_uri;`. Behind a TLS-terminating proxy test X-Forwarded-Proto, not %{HTTPS}.
3. Remove the other rules (control panel redirects, force-HTTPS / force-www plugins) so no address takes two hops.
4. Send `Strict-Transport-Security: max-age=31536000; includeSubDomains` on both names once https:// works on both.
5. Verify with curl -sI on all four root addresses: three answer 301 with location https://example.com/… in one hop, the final one 200; show me the output.
Tell me exactly which files or settings you changed.

Resources:
- Google Search Central, redirects and Google Search: https://developers.google.com/search/docs/crawling-indexing/301-redirects
- Cloudflare, Single Redirects: https://developers.cloudflare.com/rules/url-forwarding/single-redirects/

Проверьте свой сайт, чтобы узнать, есть ли у него эта проблема. Проверить сайт