2012-10-21 22 views
52

Próbuję przekierować https://www.example.com do http://www.example.com. Próbowałem następujący kod w pliku .htaccessHttps do http przekierowania za pomocą htaccess

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^example\.com$ [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

Ten kod skutecznie przekierowuje https://example.com do http://www.example.com. Jednak po wpisaniu numeru https://www.example.com pojawia się błąd "brak strony internetowej" w przeglądarce.

Próbowałem również następujące 2 kody bez powodzenia

Próba 1

RewriteEngine On 
RewriteCond %{HTTPS} !=on 
RewriteRule ^/(.*):NOSSL$ http://www.example.com/$1 [R=301,L] 

Próba 2

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

Oba powyższe próby zawiodły. Jakieś sugestie?

Odpowiedz

82

Próba 2 była bliska ideału. Wystarczy zmodyfikować ją nieco:

RewriteEngine On 
RewriteCond %{HTTPS} on 
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
+5

Będzie dobrze używać 'R = 302' jeżeli nie chcesz, aby _permanent_. Wpadło mi to w kłopoty, gdy mój SSL wygasł i chciałem tymczasowo wrócić do "http", zanim przejdę przez bolesne procedury odnawiania. – ProfNandaa

+0

Bolesne odnowienie? Powinny to być albo przerzucanie plików certyfikatów, albo wykonywanie prostych skryptów ... Problem z 302 polega na tym, że klienci muszą za każdym razem podążać za nim, więc zwiększasz liczbę żądań dla klienta i serwera. – arkascha

+0

@arkascha Chciałem tylko zrozumieć, że RewriteCond będzie działał jako instrukcja wypowiedzenia? Chodzi mi o to, że tylko tam, gdzie znajdzie https, uruchomi kolejną regułę przepisywania. Pytam, ponieważ Google automatycznie wziął w swoim indeksie kilka adresów URL w postaci protokołu HTTPS bez konieczności łączenia ich z dowolnego miejsca. Dlatego też, aby wykluczyć jakiekolwiek błędy, używamy powyższego kodu do 302 wszystkich adresów https –

6
RewriteEngine On 
RewriteCond %{SERVER_PORT} 443 
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
+0

Wydaje się, że to wystarczy, gdy inni nie! –

22

Jednakże, jeśli strona nie posiada certyfikat bezpieczeństwa, to w środowisku współdzielonym hostingu, a nie chcesz, aby uzyskać „ostrzeżenie”, gdy strona jest będąc żądanym przez https, nie możesz przekierować go za pomocą htaccess. Powodem jest to, że komunikat ostrzegawczy zostanie wywołany, zanim żądanie przejdzie nawet do pliku htaccess, więc musisz go naprawić na serwerze. Przejdź do /etc/httpd/conf.d/ssl.conf i skomentuj część dotyczącą serwera wirtualnego 443. Ale szanse są takie, że twój dostawca usług hostingowych nie da ci takiej kontroli. Musisz przenieść się do innego hosta lub kupić SSL, aby ostrzeżenie nie zadziałało, zanim htaccess ma szansę na przekierowanie.

+1

Dziękuję za tę odpowiedź. Ponieważ nasza istniejąca strona nie ma certyfikatu SSL, dlatego nie ważne, jak poprawny jest mój .htaccess, nie zadziała. – marknt15

+0

@arkascha Próbowałem różnych metod udostępnionych tutaj, ale żaden nie działał. Tak, przetestowałem w środowisku współdzielonym. Protokół SSL jest nieaktywny, ale udostępniony protokół SSL jest bezpłatny.Odnośnik https był historycznie/odziedziczony po wcześniejszym korzystaniu z SSL. Nie mam nic przeciwko ostrzeżeniu przeglądarki (w trybie deweloperskim), ale potrzebowałem przynajmniej przekierowania. Ktoś może zaoferować więcej potencjalnych klientów? –

1

Różnica między http i https polega na tym, że żądania https są wysyłane za pośrednictwem połączenia szyfrowanego przez ssl. Połączenie szyfrowane przez ssl musi zostać nawiązane między przeglądarką a serwerem, zanim przeglądarka wyśle ​​żądanie http.

Żądania HTTP są w rzeczywistości żądaniami http wysyłanymi za pośrednictwem zaszyfrowanego połączenia ssl. Jeśli serwer odrzuci połączenie SSL, przeglądarka nie będzie miała połączenia, aby przesłać żądanie. Przeglądarka i serwer nie będą mogły ze sobą rozmawiać. Przeglądarka nie będzie mogła wysłać adresu URL, do którego chce uzyskać dostęp, a serwer nie będzie mógł odpowiedzieć przekierowaniem do innego adresu URL.

To nie jest możliwe. Jeśli chcesz odpowiedzieć na linki https, potrzebujesz certyfikatu SSL.

5

Można użyć następującą regułę przekierować z https do http:

RewriteEngine On 


RewriteCond %{HTTPS} ^on$ 
RewriteRule ^(.*)$ http://example.com/$1 [NC,L,R] 

Objaśnienie:

Sprawdza czy HTTPS jest na (Request odbywa się za pomocą https)

Następnie

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

Przekierowanie każde żądanie (https://example.com/foo) dohttp://example.com/foo.

  • $ 1 jest częścią regex w RewriteRule wzór zawiera ona cokolwiek wartość została schwytana w (. +), w tym przypadku, to oddaje pełną REQUEST_URI wszystko po nazwie domeny.

  • [NC, L, R] to flagi, NC sprawia, że ​​uri case senstive, możesz użyć zarówno wielkich, jak i małych liter w żądaniu.

L flaga informuje serwer przestanie PRZETWARZANIE inne zasady, jeśli reguła currunt został dopasowany, ważne jest, aby użyć flagi L, aby uniknąć konfliktu przepisów reguły, gdy masz więcej niż na zasadach w bloku.

Flaga R służy do zewnętrznego przekierowania.

0
RewriteCond %{HTTP:X-Forwarded-Proto} =https 
+0

to mi bardzo pomaga. –

0

Twój kod jest prawidłowy. Wystarczy umieścić je wewnątrz <VirtualHost *:443>

Przykład:

<VirtualHost *:443> 
    SSLEnable 

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

</VirtualHost> 
Powiązane problemy