Mam następujący kod htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond !{HTTPS} off
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
Chcę, aby moja witryna została przekierowana za https://www.
pomocą HTTPS i wymusiła www.
poddomenę, ale kiedy uzyskuję dostęp http://www.
(bez HTTPS), nie przekierowuje mnie do niej za https://www
pomocą HTTPS.
RewriteCond %{HTTPS} =off
Odpowiedzi:
Aby najpierw wymusić HTTPS, musisz sprawdzić poprawną zmienną środowiskową
%{HTTPS} off
, ale twoja reguła powyżej poprzedza:www.
Ponieważ masz drugą regułę do wymuszeniawww.
, nie używaj jej w pierwszej regule.O pośrednictwie
W przypadku niektórych form proxy, w których klient łączy się za pośrednictwem HTTPS z serwerem proxy, modułem równoważenia obciążenia, aplikacją pasażera itp.,
%{HTTPS}
Zmienna może nigdy nie byćon
przyczyną pętli przepisywania. Wynika to z faktu, że aplikacja faktycznie odbiera zwykły ruch HTTP, mimo że klient i serwer proxy / moduł równoważenia obciążenia używają protokołu HTTPS. W takich przypadkach sprawdźX-Forwarded-Proto
nagłówek zamiast%{HTTPS}
zmiennej. Ta odpowiedź pokazuje odpowiedni procesźródło
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
adresu URL takiego jak exaple.com/?bla=%20 stał się exaple.com/?bla=%2520 , tzn. Znak procentu został zakodowany. Rozważ użycie flagi,NE
aby zapobiec podwójnemu kodowaniu:RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
X-Forwarded-Proto
nagłówka w celu weryfikacji HTTPS zamiast%{HTTPS}
zmiennej. Nie powiedziałeś, która część powoduje pętlę,www
czy część HTTPS, ale to pierwsza rzecz, która przychodzi mi na myśl.http://example.com
(np. HTTP i nie www), otrzymasz podwójne przekierowanie. Najpierw dohttps://example.com
(pierwsza reguła), a następnie dohttps://www.example.com
(druga reguła). Możesz to naprawić, po prostu odwracając te dwie reguły, ponieważ obie reguły przekierowują na HTTPS niezależnie.Odpowiedź Michalsa działała dla mnie, choć z jedną małą modyfikacją:
Problem:
gdy masz pojedynczy certyfikat bezpieczeństwa witryny , przeglądarka, która próbuje uzyskać dostęp do Twojej strony bez https: // www. (lub którąkolwiek domenę, którą obejmuje Twój certyfikat) wyświetli brzydki czerwony ekran ostrzegawczy, zanim jeszcze otrzyma przekierowanie na bezpieczną i poprawną stronę https.
Rozwiązanie
Najpierw użyj przekierowania na stronę www (lub dowolną domenę objętą certyfikatem), a dopiero potem przekieruj https. Zapewni to, że Twoi użytkownicy nie będą mieli do czynienia z żadnym błędem, ponieważ przeglądarka widzi certyfikat, który nie obejmuje bieżącego adresu URL.
źródło
https://example.com
, ale moim zdaniem jest to najmniej prawdopodobny format, który może wpisać użytkownik. (Przyjęta odpowiedź będzie miała ten sam problem)https://
bezwww
posiadania certyfikatu tylkowww
, po prostu dodaj tę regułę do rozwiązania:RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301]
po prostu wraca dohttp
próby połączenia,https://example.com
aby uniknąć błędu certyfikatu.http://example.com
(tj. HTTP i brak www)Jeśli korzystasz z CloudFlare lub podobnego CDN, otrzymasz błąd nieskończonej pętli dzięki rozwiązaniom% {HTTPS} podanym tutaj. Jeśli jesteś użytkownikiem CloudFlare, musisz użyć tego:
źródło
=http
do!=https
naszych środowisk.X-Forwarded-Proto
nagłówek nie został zadeklarowany, jeśli http, podobnie!=https
zrobiła sztuczka.{HTTPS}
nie działa. Próbowałem,{ENV:HTTPS}
a nawet{SERVER_PORT} 443
, ale ostatecznie było tak, ponieważ musiałem sprawdzić niestandardowe nagłówki żądań HTTP Cloudflare.ZŁE ROZWIĄZANIE I DLACZEGO!
Nigdy nie używaj poniższego rozwiązania, ponieważ kiedy używasz ich kodu, jest to coś takiego:
Przeglądarka przechodzi do:
Następnie przekierowuje do:
Następnie przekierowuje do:
To za dużo żądań do serwera.
Większość odpowiedzi, nawet zaakceptowanych, ma ten problem.
NAJLEPSZE ROZWIĄZANIE I ODPOWIEDŹ
Ten kod ma
[OR]
warunek, aby zapobiec podwójnym zmianom w adresie URL!źródło
RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
wp-content/cache/page_enhanced/
i tak dalej. Jak mogę to naprawić? Edycja: Wygląda na to, że muszę to umieścić na górze.htaccess
. Dzięki za skrypt :)Jest to najlepszy sposób, jaki znalazłem dla użytkowników proxy, a nie użytkowników proxy
źródło
Istnieje wiele rozwiązań. Oto link do wiki Apache, która bezpośrednio zajmuje się tym problemem.
http://wiki.apache.org/httpd/RewriteHTTPToHTTPS
źródło
RewriteCond %{HTTPS} off
się,RewriteCond %{HTTPS} !=on
że zmiana warunku przepisywania z na to przekierowanie zawsze się zdarza, wydaje mi się to lepszą odpowiedzią.Aby przekierować http: // lub https: // na https: // www , możesz użyć następującej reguły dla wszystkich wersji apache:
Apache 2.4
Zauważ, że zmienna% {REQUEST_SCHEME} jest dostępna do użycia od Apache 2.4 .
źródło
Jeśli korzystasz z CloudFlare, upewnij się, że używasz czegoś takiego.
To uratuje Cię od pętli przekierowań i bezpiecznie przekieruje twoją stronę na SSL.
PS Dobrym pomysłem jest sprawdzenie mod_rewrite.c!
źródło
źródło
Uwagi: Upewnij się, że wykonałeś następujące kroki
Teraz Twój .htaccess będzie działał, a Twoja strona przekieruje na http: // na https: // www
źródło
Podobnie jak w rozwiązaniu Amira Forsatiego przekierowanie htaccess na https: // www, ale dla zmiennej nazwy domeny sugeruję:
źródło
Ustaw w pliku .htaccess
źródło
Użyłem poniższego kodu z tej strony, działa świetnie https://www.freecodecamp.org/news/how-to-redirect-http-to-https-using-htaccess/
Mam nadzieję, że to pomoże
źródło
Próbuję pierwszej odpowiedzi i to nie działa ... Ta praca:
źródło