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?
http://
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?
http://
Odpowiedzi:
Aktualizacja: Chociaż ta odpowiedź została zaakceptowana kilka lat temu, należy pamiętać, że jej podejście jest obecnie zalecane w dokumentacji Apache. Redirect
Zamiast tego użyj . Zobacz tę odpowiedź .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
przekierowanie do https://server/foo?email=someone%2540example.com
znaku „@” jest dwukrotnie cytowane w adresie URL . Użycie metody z odpowiedzi @ ssc nie ma tego problemu.
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.
Dokumenty Apache odradzają używanie przepisywania:
Aby przekierować
http
adresy URLhttps
, 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 .htaccess
zadanego w pytaniu.
Ten artykuł mógł pojawić się dopiero po zadaniu pytania i udzieleniu odpowiedzi, ale wydaje się, że jest to aktualna droga.
permanent
słowa kluczowego, efekt jest taki sam (przeglądarka otrzymuje przekierowanie 301). Np .:Redirect permanent "/" "https://example.com"
Polecam z przekierowaniem 301:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[L]
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 ).
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]
http://www.example.com/...
ponieważ dwa warunki są domyślnie ORAZ. Zamiast tego powinny być OR, tzn. dołącz OR
flagę 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 .
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
.htaccess
idzie Ponadto ten link jest martwy.
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]
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.
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
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 .htaccess
pliku. 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']);
}
.htaccess
pliku?
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]
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
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ć Redirect
wewnętrznej if
dyrektywy do przekierowania http
żądańhttps
.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
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.
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?
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ę).
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]
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]
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]
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.
Jeśli używasz Apache, mod_rewrite jest najłatwiejszym rozwiązaniem i ma mnóstwo dokumentacji online, jak to zrobić. Na przykład: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
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 :-))
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.
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
httpd
, a nie PHP.