Я управляю небольшим веб-сайтом в среде LAMP общего хостинга: это означает, что единственное, что я могу редактировать, - это файл htaccess. .
Я хотел добавить поддержку HSTS (и я это сделал), но когда я протестировал свой веб-сайт здесь на соответствие требованиям предварительной загрузки HSTS, я получил следующую ошибку:
Ошибка: HTTP перенаправляет сначала на www
http: // example
(HTTP) должен немедленно перенаправлять наhttps: // example
(HTTPS) перед добавлением субдомена www. Сейчас, первое перенаправление - наhttps: //www.example.
Дополнительное перенаправление требуется, чтобы любой браузер, поддерживающий HSTS, записывал запись HSTS для домена верхнего уровня, а не только для субдомена.
Итак, я полагаю, мне следует перенаправить пользователей следующим образом:
http: // example
(это то, что пользователь вводит в адресной строке своего браузера) https: // example
(мы перенаправляем его на HTTPS-версию сайта) 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? И: есть ли риски?
Как указано в требованиях к отправке списка предварительной загрузки HSTS :
- Перенаправление с 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 и вершина домена).
Дополнительная литература:
.htaccess
: https : //webmasters.stackexchange.com/a/112264/52912