Jak przekierować wszystkie żądania HTTP do HTTPS

294

Próbuję przekierować wszystkie niepewne żądania HTTP w mojej witrynie (np. http://www.example.com) Na HTTPS ( https://www.example.com). Używam PHP Btw. Czy mogę to zrobić w .htaccess?

Kot
źródło
1
Możesz (i powinieneś) to zrobić za pomocą swojego httpd, a nie PHP.
zanurzyć
2
@jnpcl, chociaż zgadzam się, że rozwiązanie httpd jest lepsze niż rozwiązanie oparte na PHP, nie sądzę, aby systematyczne przekierowywanie było ogólnie dobrą praktyką. Jeśli chcesz przekierowywać użytkowników do HTTPS przez cały czas, wyślij ich tam z „punktu wejścia” (pierwszego linku do Twojej witryny), nie rób tego w połowie, ponieważ może to spowodować wyciek niektórych danych, które Twoim zdaniem jest chroniony (jeśli nie zauważysz tego natychmiastowego przekierowania).
Bruno,
@Bruno: Myślałem bardziej o zduplikowanych żądaniach HTTP, potencjale zagubionych ciągów zapytań i możliwości ręcznego wpisywaniahttp://
drud
@ jnpcl to naprawdę dobra uwaga. Po prostu sugerowałem, że chociaż ludzie często proszą o takie przekierowanie w celu poprawy bezpieczeństwa swojej witryny, często tak naprawdę nie poprawia jej (ponieważ nie uniemożliwia to tego samego żądania przejścia przez zwykły HTTP) .
Bruno,
8
@outis: pierwszy opublikowany link to pytanie.
Mei

Odpowiedzi:

305

Aktualizacja: Chociaż ta odpowiedź została zaakceptowana kilka lat temu, należy pamiętać, że jej podejście jest obecnie zalecane w dokumentacji Apache. RedirectZamiast tego użyj . Zobacz tę odpowiedź .


RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Reese Moore
źródło
24
@Cat, jak mówiłem w mojej odpowiedzi / komentarzach, jeśli próbujesz „przekierować wszystkie niepewne HTTP [...] na HTTPS”, to podejście nie zabezpieczy tych żądań, po prostu sprawi, że przeglądarka je wykona. dwa razy, raz niepewny i raz bezpieczny.
Bruno,
13
To, co powinieneś naprawdę robić, to używać HSTS w zgodzie z tym.
Reese Moore
3
Może to być błąd w mojej wersji apache (2.4.6 w pakiecie w Centos 7), ale mam pewne problemy z niektórymi adresami URL. Na przykład http://server/foo?email=someone%40example.comprzekierowanie do https://server/foo?email=someone%2540example.comznaku „@” jest dwukrotnie cytowane w adresie URL . Użycie metody z odpowiedzi @ ssc nie ma tego problemu.
psmears
2
Zła odpowiedź. Przekieruje tylko podstawowy adres URL, a nie adresy URL w podfolderach. RewriteRule (. *) Https: //% {HTTP_HOST}% {REQUEST_URI} [R = 301, L] to poprawna odpowiedź
FredTheWebGuy
7
Niekoniecznie In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
Adam,
338

Dokumenty Apache odradzają używanie przepisywania:

Aby przekierować httpadresy URL https, wykonaj następujące czynności:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Ten fragment kodu powinien przejść do pliku konfiguracji głównego serwera, a nie do pliku .htaccesszadanego w pytaniu.

Ten artykuł mógł pojawić się dopiero po zadaniu pytania i udzieleniu odpowiedzi, ale wydaje się, że jest to aktualna droga.

ssc
źródło
11
To powinna być aktualna odpowiedź. Ale co dokładnie dzieje się w „konfiguracji SSL”? Pełny przykład byłby naprawdę pomocny.
Ben
6
@Ben: to inne pytanie, które jest szeroko udokumentowane online; nawiasem mówiąc, właśnie dodałem wczoraj prawie pełny przykład: serverfault.com/q/597012/26210, który może dać ci wyobrażenie o tym, co dzieje się w konfiguracji SSL
ssc
46
To świetna wskazówka. Ale w dokumencie Apache wspomina również: „W przypadku przekierowania http-na-https użycie RewriteRule byłoby odpowiednie, jeśli nie masz dostępu do głównego pliku konfiguracyjnego serwera i jesteś zobowiązany do wykonania tego zadania w zamiast tego plik .htaccess. ” Tak jest w moim przypadku ...
peter_the_oak
4
@ user1844933 Jeśli używasz permanentsłowa kluczowego, efekt jest taki sam (przeglądarka otrzymuje przekierowanie 301). Np .:Redirect permanent "/" "https://example.com"
BeetleJuice
2
@Whitecat W Centos 6 plik znajduje się na /etc/httpd/conf/httpd.conf
dstonek
141

Polecam z przekierowaniem 301:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
David
źródło
7
dzięki, to działa dla mnie, zaakceptowana odpowiedź nie .. prawdopodobnie z powodu braku[L]
billynoah
1
Tak. To poprawna odpowiedź, ponieważ kieruje również wszystkie adresy URL w podfolderach
FredTheWebGuy,
Czy to jest na najwyższym poziomie pliku htaccess?
CodyBugstein
1
@CodyBugstein Tam zawsze go umieszczam i zawsze działa.
Daan van den Bergh
3
We wszystkich odpowiedziach brakuje jednej rzeczy - każdy kod przekierowania musi być umieszczony na początku pliku .htaccess, PRZED czymkolwiek innym, jeśli chcesz, aby wszystkie strony były przekierowane na https.
Vadim Anisimov
35

Jak mówiłem w tym pytaniu , sugeruję unikanie przekierowywania wszystkich żądań HTTP do ich ekwiwalentu HTTPS na ślepo, ponieważ może to spowodować fałszywe wrażenie bezpieczeństwa. Zamiast tego należy prawdopodobnie przekierować „katalog główny” witryny HTTP do katalogu głównego witryny HTTPS i stamtąd link, tylko do HTTPS.

Problem polega na tym, że jeśli jakiś link lub formularz w witrynie HTTPS zmusza klienta do wysłania żądania do witryny HTTP, jego zawartość będzie widoczna przed przekierowaniem.

Na przykład, jeśli jedna z twoich stron obsługiwanych przez HTTPS ma formularz, który mówi <form action="http://example.com/doSomething">i wysyła niektóre dane, które nie powinny być wysyłane w wyraźny sposób, przeglądarka najpierw wyśle ​​pełne żądanie (w tym encję, jeśli jest to POST) do strony HTTP pierwszy. Przekierowanie zostanie natychmiast wysłane do przeglądarki, a ponieważ duża liczba użytkowników wyłącza lub ignoruje ostrzeżenia, prawdopodobnie zostanie zignorowana.

Oczywiście błąd w podawaniu linków, które powinny być do strony HTTPS, ale w końcu dla strony HTTP, może powodować problemy, gdy tylko coś nasłuchuje na porcie HTTP na tym samym adresie IP, co strona HTTPS. Uważam jednak, że zachowanie tych dwóch witryn jako „kopii lustrzanej” zwiększa jedynie prawdopodobieństwo popełnienia błędów, ponieważ możesz mieć skłonność do zakładania, że ​​sam się poprawi, przekierowując użytkownika do HTTPS, podczas gdy często jest już za późno. (W tym pytaniu były podobne dyskusje ).

Bruno
źródło
1
Podejmując decyzję o obsłudze całej witryny jako HTTPS, tego rodzaju przekierowanie ma sens. Nie chcę, aby użytkownik otrzymał 403, ponieważ podał http dla swojej strony docelowej. Zgadzam się, jeśli ktoś NIE określi http w linku i wdroży go do produkcji, która jest ZŁA. NALEŻY go złapać podczas testowania, nawet przy przekierowaniu na miejscu. Nie podoba mi się argument „mógł”, ponieważ to „mogło” nastąpić bez przekierowania. Objawy są takie same podczas testowania w bezpiecznej przeglądarki, z wyjątkiem po potwierdzeniu wysłać w klarowny przekierowuje zamiast odbierania 403.
Derek Litz
Tak, widzę korzyść polegającą na ciężkim niepowodzeniu, jeśli ktoś omyłkowo wstawi http do akcji formularza, ale w większości przypadków ważniejsze jest bycie łagodnym przy wpisywaniu adresów URL.
Daniel Lubarov
4
@Daniel, zgadzam się, że warto być pobłażliwym, gdy użytkownicy wpisują adres URL. Powiedziałbym, że jest to jeden z przypadków, w których lepiej jest wyłączyć tę funkcję podczas programowania / testowania, ale włączyć ją podczas produkcji (lub na ostatnich etapach programowania / testowania).
Bruno
dlaczego nie zrobić http do https w dns.
Muhammad Umer
1
@MuhammadUmer, ponieważ nie ma to nic wspólnego z DNS. Używaliby ogólnie tej samej nazwy hosta, ale nawet z inną nazwą hosta nadal trzeba zmienić protokół i port.
Bruno,
18

Dowiedziałem się, że najlepszym sposobem na https i www w domenie jest

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
GiorgosK
źródło
To nie przekieruje, http://www.example.com/...ponieważ dwa warunki są domyślnie ORAZ. Zamiast tego powinny być OR, tzn. dołącz ORflagę na pierwszym warunku (i pamiętaj, aby uciec od literalnych kropek w wyrażeniu regularnym). Ale jeśli wdrażają TGV następnie nie chcesz przekierować do HTTPS i www w jednym przekierowania, należy przekierować do HTTPS pierwszy .
MrWhite
Gdzie mam umieścić ten tekst?
Aaron Franke
Na podobny typ pytania. Czy ktoś może pomóc z poniższym pytaniem? stackoverflow.com/questions/59503217/…
appsntech
14

Jest to metoda przekierowania HTML, która działa, ale nie jest najlepsza.

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

Podejście PHP

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess approch

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

skopiowane z: www.letuslook.org

Timothy Nwanwene
źródło
Gdzie .htaccessidzie Ponadto ten link jest martwy.
Aaron Franke
8

Podoba mi się ta metoda przekierowywania z http na https. Ponieważ nie muszę go edytować dla każdej witryny.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Cory
źródło
Gdzie mam umieścić ten tekst?
Aaron Franke
6

Użycie następującego kodu w pliku .htaccess automatycznie przekierowuje odwiedzających do wersji HTTPS witryny:

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Jeśli masz istniejący plik .htaccess:

Nie powielaj RewriteEngine On.

Upewnij się, że wiersze rozpoczynające się od RewriteCond i RewriteRule natychmiast następują po już istniejącym RewriteEngine.

OpenWebWar
źródło
Co oznaczają L i R?
Aaron Franke
5

Jest to właściwa metoda przekierowywania HTTP na HTTPS przy użyciu .htaccess zgodnie z GoDaddy.com. Pierwszy wiersz kodu jest oczywisty. Drugi wiersz kodu sprawdza, czy HTTPS jest wyłączony, a jeśli tak, to przekierowuje HTTP do HTTPS, uruchamiając trzeci wiersz kodu, w przeciwnym razie trzeci wiersz kodu jest ignorowany.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828

AnarchiaOutlaw
źródło
5

Najlepsze rozwiązanie zależy od twoich wymagań. To jest podsumowanie wcześniej opublikowanych odpowiedzi z dodanym kontekstem.

Jeśli pracujesz z serwerem WWW Apache i możesz zmienić jego konfigurację, postępuj zgodnie z dokumentacją Apache :

<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Ale zapytałeś też, czy możesz to zrobić w .htaccesspliku. W takim przypadku możesz użyć RewriteEngine Apache :

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]

Jeśli wszystko działa poprawnie i chcesz, aby przeglądarki zapamiętały to przekierowanie, możesz zadeklarować je jako stałe, zmieniając ostatni wiersz na:

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Ale bądź ostrożny, jeśli możesz zmienić zdanie na temat tego przekierowania. Przeglądarki zapamiętują to bardzo długo i nie sprawdzą, czy to się zmieniło.

Pierwsza linia może nie być potrzebna RewriteEngine On zależności od konfiguracji serwera WWW.

Jeśli szukasz rozwiązania PHP, spójrz na tablicę $ _SERVER i funkcję nagłówka :

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); 
} 
maikel
źródło
Wygląda na to, że dokumentacja Apache odradza trasę Rewrite. Co z przekierowaniem? Co jeszcze może iść w .htaccesspliku?
Aaron Franke
Tak, przekierowanie jest preferowane i może być używane w .htaccess. Nie można jednak dodać warunku, aby przekierowywać ruch HTTP tylko do https. Przekierowuje również https -> nieskończoną pętlę przekierowań. Wymieniłem go w dyrektywie VirtualHost używanej dla http (port 80) powyżej, .htaccess nie obsługuje tej dyrektywy i dlatego nie można tutaj użyć przekierowania.
maikel
4

Dodaj następujący kod do pliku .htaccess:

Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]

Gdzie [twoja nazwa domeny] to nazwa domeny Twojej witryny.

Możesz także przekierować określone foldery z nazwy domeny, zastępując ostatni wiersz powyższego kodu:

RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
Sourabh
źródło
Co oznaczają L i R?
Aaron Franke
4

Wykonaj wszystko, co wyjaśniono powyżej w celu przekierowania. Wystarczy dodać „HTTP Strict Transport Security” do nagłówka. Pozwoli to uniknąć ataku człowieka w środku.

Zmodyfikuj plik konfiguracyjny Apache (/etc/apache2/sites-enabled/website.conf i /etc/apache2/httpd.conf) i dodaj następujące elementy do VirtualHost:

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security

Waqas
źródło
2

Aby przekierować wszystkie httpżądania https, możesz użyć:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

Jeśli mod-rewrite nie jest włączony i korzystasz z Apache 2.4, możesz również użyć Redirectwewnętrznej ifdyrektywy do przekierowania httpżądańhttps .

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
starkeen
źródło
2

Jeśli znajdujesz się w sytuacji, w której nie możesz uzyskać dostępu do konfiguracji apache bezpośrednio dla swojej witryny, na której wiele hostowanych platform jest nadal ograniczonych w ten sposób, to właściwie zaleciłbym podejście dwuetapowe. Powód, dla którego Apache sam dokumentuje, że powinieneś użyć ich opcji konfiguracji przede wszystkim w mod_rewrite dla HTTP na HTTPS.

Po pierwsze, jak wspomniano powyżej, skonfigurujesz reguły .htaccess mod_rewrite:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Następnie w pliku (plikach) PHP (musisz to zrobić tam, gdzie byłoby to właściwe dla Twojej sytuacji, niektóre strony będą obsługiwać wszystkie żądania za pomocą jednego pliku PHP, inne obsługują różne strony w zależności od ich potrzeb i złożonego żądania) ):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

Powyższe należy uruchomić PRZED jakimkolwiek kodem, który mógłby potencjalnie ujawnić bezpieczne dane w niezabezpieczonym środowisku. W ten sposób Twoja strona korzysta z automatycznego przekierowania przez HTACCESS i mod_rewrite, podczas gdy twoje skrypty zapewniają, że dane wyjściowe nie są dostarczane, gdy nie są dostępne przez HTTPS.

Myślę, że większość ludzi tak nie myśli, dlatego Apache zaleca, aby nie używać tej metody tam, gdzie to możliwe. Jednak po prostu wymaga dodatkowej kontroli po stronie programistycznej, aby zapewnić bezpieczeństwo danych użytkownika. Mamy nadzieję, że pomoże to komuś innemu, kto może być zmuszony do skorzystania z niezalecanych metod z powodu ograniczeń na naszych usługach hostingowych.

F. Scott Gale
źródło
1

Poprzez .htaccess Pomoże to.

RewriteEngine On


RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Zobacz też, aby uzyskać więcej szczegółów. Jak przekierować HTTP na HTTP?

Roshan Padole
źródło
1
Jest to rozwiązanie dla każdego, kto otrzyma błąd „Zbyt wiele przekierowań” i nie może zmienić właściwości allowOverride.
Evochrome
1

O ile nie potrzebujesz mod_rewrite do innych rzeczy, użycie dyrektywy IF Apache core jest czystsze i szybsze:

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

Możesz dodać więcej warunków do dyrektywy IF, na przykład zapewnić jedną domenę kanoniczną bez prefiksu www:

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

Używanie mod_rewrite do wszystkiego jest bardzo obojętne, ale sprawdź, czy to zadziała.

Więcej informacji: https://httpd.apache.org/docs/2.4/mod/core.html#if

Aby zobaczyć to w akcji (spróbuj bez www. Lub https: // lub z .net zamiast .com): https://nohodental.com/ (strona, nad którą pracuję).

SashaK
źródło
1

przekaż ten kod do pliku .htaccess Automatycznie przekieruj HTTP na HTTPS

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Ehsan Sattari
źródło
Cześć, dziękuję za odpowiedź. Co dodaje twoja odpowiedź, które inne istniejące odpowiedzi nie mają?
Gricey
Na podobny typ pytania. Czy ktoś może pomóc z poniższym pytaniem? stackoverflow.com/questions/59503217/…
appsntech
0

Znalazłem metodę wymuszenia przekierowania wszystkich stron mojej witryny z http na analogiczne strony w https, które działają dla mnie.

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Oleg Apanowicz
źródło
0
 Redirect 301 / https://example.com/

(działało dla mnie, gdy żadna z powyższych odpowiedzi nie działała)

Premia:

ServerAlias www.example.com example.com

(naprawiono https: // www .example.com nie znaleziono)

aalesund
źródło
0

To przekierowuje wszystkie adresy URL na https i www

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
Husain Basrawala
źródło
0

Jeśli chcesz to zrobić z serwera tomcat, wykonaj poniższe czynności

W samodzielnym serwerze HTTP Apache Tomcat (8.5.x), w jaki sposób można go skonfigurować, aby jeśli użytkownik wpisze www.domain.com, zostanie automatycznie przekierowany na stronę https (www.domain.com).

2-etapowa metoda włączenia następujących elementów do [Tomcat_base] /conf/web.xml przed tagiem zamykającym

step 1: 
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

i ustawienie ustawień konektora [Tomcat_base] /conf/server.xml:

step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>

Uwaga: Jeśli już wykonałeś konfigurację https i próbujesz przekierować, wykonaj tylko krok 1.

Bhaskara Arani
źródło
-1

Inną zaletą tego problemu jest sytuacja, gdy w grę wchodzi moduł równoważenia obciążenia.

Sytuacja wygląda następująco: - Ruch z przeglądarki do modułu równoważenia obciążenia iz powrotem to (powinno być) HTTPS - Ruch między modułem równoważenia obciążenia a rzeczywistym serwerem WWW to HTTP.

Zatem wszystkie zmienne żądań serwera w PHP lub Apache pokazują, że połączenie jest po prostu HTTP. A katalogi HTTP i HTTPS na serwerze są takie same.

Warunek Rewrite w zatwierdzonej odpowiedzi nie działa. Daje pętlę lub po prostu nie działa.

Pytanie brzmi: jak to zrobić w module równoważenia obciążenia.

(Lub jest źle skonfigurowany moduł równoważenia obciążenia. Mam na to nadzieję, ponieważ wtedy mogę przenieść problem do firmy WebHosting :-))

BertC
źródło
Zamiast tego przekierowanie musiałoby się odbyć na module równoważenia obciążenia. W zależności od typu modułu równoważenia obciążenia powinno to być możliwe w konfiguracji lub w samej instancji apache, w której działałaby zaakceptowana odpowiedź. Po prostu nie rób tego na pojedynczych węzłach.
marc82ch,
-1

Jeśli korzystasz z usługi elastycznego równoważenia obciążenia Amazon Web Services, która akceptuje ruch https i kieruje go na serwer (y) za pomocą protokołu http, poprawny sposób przekierowywania całego ruchu HTTP na https opisano tutaj: https://aws.amazon. com / premiumsupport / Knowledge-center / redirect-http-https-elb

Użyj nagłówka X-Forwarded-Proto (zawiera http lub https), który jest zawsze zawarty w żądaniach http z modułu równoważenia obciążenia, jak opisano tutaj: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x- forwarded-headers.html

W pliku httpd.conf:

<VirtualHost *:80>

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

</VirtualHost>

Lub w głównym pliku .htaccess:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

Bonus: nie będzie próbował przekierować ruchu http na lokalnym komputerze deweloperskim.

ScottyB
źródło
-1

Mi to pasuje:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

i na przykład http: // server / foo? email = ktoś% 40example.com przekierowuje normalnie bez żadnych problemów. Plik .htaccess znajduje się w folderze głównym witryny (na przykład o nazwie public_html). Możliwe jest użycie RewriteCond% {SERVER_PORT}! ^ 443 $ zamiast RewriteCond% {HTTPS}! Na

Intacto
źródło