Я управляю небольшим веб-сайтом в среде 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
серверная переменная содержит значение 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 и вершина домена).
Дальнейшее чтение:
.htaccess
: https://webmasters.stackexchange.com/a/112264/52912