HSTS и двойная переадресация

HSTS и двойная переадресация

Я управляю небольшим сайтом в среде LAMP общего хостинга: по сути, это означает, что единственное, что я могу редактировать — это файл htaccess.

Я хотел добавить поддержку HSTS (и я это сделал), но, когдаЯ протестировал свой сайт здесьдля соответствия требованиям предварительной загрузки HSTS я получил следующую ошибку:

Ошибка: HTTP сначала перенаправляет на www

http://example(HTTP) должен немедленно перенаправляться на https://example(HTTPS) перед добавлением поддомена www. Прямо сейчас первое перенаправление — на https://www.example.Дополнительное перенаправление требуется для того, чтобы любой браузер, поддерживающий HSTS, записывал запись HSTS для домена верхнего уровня, а не только для поддомена.

Итак, я полагаю, что мне следует перенаправить пользователей следующим образом:

  1. http://example(это то, что пользователь вводит в адресную строку своего браузера)
  2. https://example(мы перенаправляем его на HTTPS-версию сайта)
  3. https://www.example(мы снова перенаправляем его на поддомен www)

Мое текущее перенаправление осуществляется следующим образом:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Я попробовал добавить перенаправление перед последней строкой, вот так:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

но я получил сообщение об ошибке «Страница не перенаправляется должным образом» в браузере.

Итак, как правильно перенаправить пользователя с http-версии сайта на https и, наконец, на https с www? И: есть ли какие-либо риски?

решение1

Как отмечено наТребования к представлению списка предварительной загрузки HSTS:

  1. Перенаправление с HTTP на HTTPS на том же хосте, если вы прослушиваете порт 80.

Вам необходимо перенаправить натот же хост(т.е. HTTP_HOST), а не просто example.comсначала. Вам не нужно перенаправлять на , example.comесли пользователь запрашивает www.example.comнапрямую. (Тест будет включать запрос на example.com.) После этого вы можете перенаправить на канонический поддомен www, если это необходимо.

Я попробовал добавить перенаправление перед последней строкой, вот так:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Это создало бы цикл перенаправления, поскольку предыдущая RewriteCondдиректива применяется только к первой RewriteRule, поэтому вторая RewriteRuleбудет выполняться безусловно.

Попробуйте вместо этого сделать что-то вроде следующего:

# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]

Переменная сервера HTTP_HOSTсодержит значение Hostзаголовка HTTP-запроса (т. е. запрашиваемый хост).

Второе перенаправление гласит... для всех запросов, где запрашиваемый хост не начинается, www.то префикс www.к хосту. Однако это может быть неприемлемо, если у вас есть несколько поддоменов (которые разрешаются в одно и то же место), которые вы хотите сохранить отдельно, так как они, естественно, будут перенаправлены на поддомен www.

Обратите внимание, что это 302 (временные) перенаправления. Меняйте на 301 только тогда, когда вы уверены, что все работает нормально.

И: есть ли какие-то риски?

Никаких рисков. Да, потенциально есть два перенаправления, тогда как раньше могло быть только одно (что, возможно, менее эффективно). Но все еще есть только два перенаправления, что вполне нормально для SEO. Кроме того, с HSTS пользовательский агент будет сталкиваться с двойным перенаправлением максимум один раз.


RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

В стороне:(На данный момент игнорируем HSTS...) Это само по себе не было бы полным, поскольку не канонизирует запрос https://example.com/...(например, HTTPS и вершину домена).


Дальнейшее чтение:

Связанный контент