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? І: чи є якісь ризики?

Відповіді:


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 заголовка (тобто. Будь хост запитується).

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, принаймні: у менеджері веб-сайтів постачальника хостингу є панель перенаправлення)

1
Btw, ваше рішення ПЕРЕФЕКТНО працює! :-)

1
"панель переспрямування в менеджері веб-сайтів постачальника хостингу" - я завжди насторожено ставлюся до таких інструментів. Наприклад, розділ переадресації в cPanel дуже обмежений і досить горезвісний.
MrWhite

1
Це залежить від того, як ви встановлюєте Strict-Transport-Securityзаголовок відповіді. Наприклад, щоб встановити це на переадресацію, вам потрібно буде використовувати alwaysаргумент Headerдирективи. Я відповів на відповідне запитання про стек Pro Webmasters (пропустіть першу частину моєї відповіді про on/ off), де детальніше про впровадження "HSTS preload " в .htaccess.
MrWhite

1
Ласкаво просимо. Якщо чесно, стек Pro Webmasters , ймовірно, більше підходить для .htaccess-пов'язаних питань (ServerFault передбачає, що ви повністю контролюєте сервер, і в цьому випадку ви цього не робите .htaccess). Це, можливо, простіше реалізувати в серверній конфігурації, використовуючи окремі <VirtualHost>контейнери (оскільки вам не потрібно возитися з оточенням та додатковими умовами - це "чистіше" та менш схильне до помилок). Я не думаю, що я рекомендував би подати "попередній список", якщо у вас є лише доступ .htaccess. (Мій 2в)
MrWhite
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.