HSTS i podwójne przekierowanie

9

Zarządzam małą stroną internetową we współdzielonym środowisku LAMP: to w zasadzie oznacza, że ​​jedyną rzeczą, którą mogę edytować, jest plik htaccess.

Chciałem dodać obsługę HSTS (i zrobiłem to), ale kiedy przetestowałem tutaj swoją witrynę pod kątem uprawnień do wstępnego ładowania HSTS, otrzymałem następujący błąd:

Błąd: HTTP najpierw przekierowuje na www

http://example(HTTP) powinien natychmiast przekierować na https://example(HTTPS) przed dodaniem subdomeny www. W tej chwili pierwsze przekierowanie to https://www.example.Dodatkowe przekierowanie jest wymagane, aby każda przeglądarka obsługująca HSTS rejestrowała wpis HSTS dla domeny najwyższego poziomu, a nie tylko subdomeny.

Przypuszczam, że powinienem przekierowywać użytkowników w ten sposób:

  1. http://example (właśnie to użytkownik wprowadza w pasku adresu swojej przeglądarki)
  2. https://example (przekierowujemy go do wersji strony HTTPS)
  3. https://www.example (ponownie przekierowujemy go do subdomeny www)

Moje obecne przekierowanie odbywa się w następujący sposób:

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

Próbowałem dodać przekierowanie przed ostatnim wierszem w ten sposób:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

ale w przeglądarce pojawia się błąd „strona nie przekierowuje poprawnie”.

Jaki jest zatem właściwy sposób przekierowania użytkownika z wersji http witryny do https i wreszcie do https z www? I: czy są jakieś zagrożenia?

HBruijn
źródło

Odpowiedzi:

10

Jak wspomniano w wymaganiach dotyczących przesyłania listy wstępnego ładowania HSTS :

  1. Przekieruj z HTTP na HTTPS na tym samym hoście, jeśli nasłuchujesz na porcie 80.

Musisz przekierować do tego samego hosta (tj. HTTP_HOST), A nie tylko do example.compierwszego. Nie musisz przekierowywać, example.comjeśli użytkownik tego zażądawww.example.com bezpośrednio. (Test będzie obejmował żądanie example.com.) Następnie możesz przekierować do kanonicznej subdomeny www, jeśli jest to wymagane.

Próbowałem dodać przekierowanie przed ostatnim wierszem w ten sposób:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

To stworzyłoby pętlę przekierowania, ponieważ poprzednie RewriteCond dyrektywa dotyczy tylko pierwszej RewriteRule, więc druga RewriteRuledziałałaby bezwarunkowo.

Zamiast tego spróbuj czegoś takiego:

# 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]

The HTTP_HOSTZmienna serwer zawiera wartość Hostnagłówka żądania HTTP (tj. Niezależnie od gospodarza jest wymagane).

Drugi stan przekierowania ... dla wszystkich żądań, w których żądany host się nie uruchamia, www.następnie prefiks www.do hosta. Jednak może to być nie do przyjęcia, jeśli masz wiele subdomen (które rozwiązują to samo miejsce), które chcesz zachować osobno, ponieważ naturalnie zostaną one przekierowane do subdomeny www.

Pamiętaj, że są to przekierowania 302 (tymczasowe). Zmień na 301 tylko wtedy, gdy masz pewność, że działa OK.

I: czy są jakieś zagrożenia?

Bez ryzyka. Tak, potencjalnie są dwa przekierowania, podczas gdy wcześniej mogło być tylko jedno (co jest prawdopodobnie mniej wydajne). Ale wciąż są tylko dwa przekierowania, co jest całkowicie OK dla SEO. Poza tym w przypadku HSTS klient użytkownika może kiedykolwiek doświadczyć podwójnego przekierowania tylko raz.


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

Na bok: (Na razie ignoruję HSTS ...) To nie byłoby kompletne samo w sobie, ponieważ nie kanonizuje żądania https://example.com/...(tj. HTTPS i wierzchołek domeny).


Dalsza lektura:

MrWhite
źródło
Dziękuję bardzo, wkrótce to przetestuję. Szybka odpowiedź na końcowy Na bok: ten i tak działa, ale wygląda na to, że jest to coś, czego nie mogę bezpośrednio kontrolować (przynajmniej nie w pliku htaccess: w menedżerze strony dostawcy hostingu znajduje się panel przekierowań)
1
Btw, Twoje rozwiązanie DZIAŁA IDEALNIE! :-)
1
„panel przekierowań w menedżerze witryn dostawcy usług hostingowych” - zawsze bałem się takich narzędzi. Na przykład sekcja przekierowań w cPanel jest bardzo ograniczona i raczej notoryczna.
MrWhite,
1
Zależy to od sposobu ustawienia Strict-Transport-Securitynagłówka odpowiedzi. Na przykład, aby ustawić to na przekierowanie, musisz użyć alwaysargumentu na Headerdyrektywie. Odpowiedziałem na powiązane pytanie dotyczące stosu Pro Webmasterzy (pomiń pierwszą część mojej odpowiedzi na temat on/ off), która zawiera bardziej szczegółowe informacje na temat implementacji „ wstępnego ładowania HSTS ” w .htaccess.
MrWhite
1
Nie ma za co. Szczerze mówiąc, stos Pro Webmasters jest prawdopodobnie bardziej odpowiedni do .htaccesstylko powiązanych pytań (ServerFault zakłada, że ​​masz pełną kontrolę nad serwerem, w którym to przypadku nie robiłbyś tego .htaccess). Jest to prawdopodobnie łatwiejsze do zaimplementowania w konfiguracji serwera za pomocą oddzielnych <VirtualHost>kontenerów (ponieważ nie musisz zadzierać z zmiennymi env i dodatkowymi warunkami - jest „czystszy” i mniej podatny na błędy). Nie sądzę, że poleciłbym przesłanie listy „preload list”, jeśli tylko masz dostęp .htaccess. (My 2c)
MrWhite