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? И: есть ли риски?

9
задан 11 September 2018 в 10:33
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 содержит значение заголовка HTTP-запроса Host (т.е. любой запрашиваемый хост).

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

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

И: есть ли риски?

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


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

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


Дополнительная литература:

10
ответ дан 2 December 2019 в 22:31

Теги

Похожие вопросы