HSTS и двойной редирект

9

Я управляю небольшим веб-сайтом в среде 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? И: есть ли риски?

HBruijn
источник

Ответы:

10

Как отмечено в требованиях к представлению списка предварительной загрузки 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 и апекс домена).


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

MrWhite
источник
Спасибо большое, скоро опробую. Быстрый ответ на последний пункт: это работает в любом случае, но похоже, что это то, что я не могу напрямую контролировать (по крайней мере, не в файле htaccess: в менеджере веб-сайта хостинг-провайдера есть панель перенаправления)
1
Кстати, ваше решение отлично работает! :-)
1
«Панель перенаправления в менеджере хостинг-провайдера» - я бы всегда остерегался таких инструментов. Например, раздел перенаправлений в cPanel очень ограничен и довольно печально известен.
MrWhite
1
Это зависит от того, как вы устанавливаете Strict-Transport-Securityзаголовок ответа. Например, чтобы установить это в редиректе, вам нужно использовать alwaysаргумент в Headerдирективе. Я ответил на связанный вопрос о стеке Pro Webmasters (пропустите первую часть моего ответа о on/ off), в котором более подробно рассказывается о реализации « предварительной загрузки HSTS » .htaccess.
MrWhite
1
Пожалуйста. Честно говоря, стек профессиональных веб-мастеров, вероятно, больше подходит для .htaccessвопросов, связанных только с этим (ServerFault предполагает, что у вас есть полный контроль над сервером, и в этом случае вы бы этого не делали .htaccess). Возможно, проще реализовать это в конфигурации сервера с использованием отдельных <VirtualHost>контейнеров (поскольку вам не нужно связываться с env vars и дополнительными условиями - это «чище» и меньше подвержено ошибкам). Я не думаю, что я бы порекомендовал "предварительную загрузку списка", если у вас есть доступ только к .htaccess. (My 2c)
MrWhite