2008-08-12 23 views
136

Jak przekierować HTTPS na HTTP ?. To jest przeciwieństwo tego, co (na pozór) wszyscy uczą.Jak przekierować HTTPS na HTTP?

Mam serwer na HTTPS, za który zapłaciłem certyfikat SSL i lustro, którego nie mam i trzymam tylko na wypadek sytuacji awaryjnych, więc nie zasługuje na uzyskanie certyfikatu.

Na komputerach moich klientów mam NIEKTÓRE skróty, które wskazują na http://production_server i https://production_server (obie prace). Wiem jednak, że jeśli mój serwer produkcyjny ulegnie awarii, przekierowanie DNS zostanie uruchomione, a ci klienci, którzy mają "https" na swoim skrócie, będą wpatrywać się w https://mirror_server (co nie działa) i duży, gruby ekran Internet Explorer 7, czerwony nieprzyjemność dla mojej firmy.

Niestety, nie mogę tego zmienić na poziomie klienta. Ci użytkownicy są bardzo analfabetami komputerowymi: i bardzo prawdopodobne jest, że zwariują na skutek błędów HTTPS "niepewności" (zwłaszcza w sposobie, w jaki obecnie obsługują to Firefox 3 i Internet Explorer 7: FULL STOP, na szczęście, ale nie pomaga mi tutaj LOL).

To very easyto findApache solutions dla http->https redirection, ale dla życia mnie nie mogę zrobić odwrotnie.

Pomysły?

Odpowiedz

114

ten nie został przetestowany, ale myślę, że to powinno działać przy użyciu mod_rewrite

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

Jak to zrobić (co muszę zmienić z tego kodu do mojej domeny, aby ten kod działał)? – Enve

+1

Enve: Wystarczy dodać do konfiguracji vhost_ssl.conf twojej witryny (lub .htaccess w katalogu głównym witryny). Nic nie trzeba zmieniać, będzie dynamicznie używać tej samej nazwy hosta i ścieżki URL. – Meogi

+1

Myślę, że możesz również chcieć przechwytywać ciągi zapytań. Nie jestem pewien, ale myślę, że powyższy fragment nie będzie przekazywał ciągów zapytań z https do http. – Rustavore

64

Należy pamiętać, że silnik Przepisz wykopuje tylko raz żądanie HTTP została odebrana - co oznacza, że ​​nadal konieczne jest posiadanie certyfikatu , aby klient mógł skonfigurować połączenie, aby wysłać żądanie!

Jeśli jednak kopia zapasowa będzie wyglądać tak, jakby miała tę samą nazwę hosta (w odniesieniu do klienta), nie powinno być powodu, dla którego nie można użyć tego samego certyfikatu co główna maszyna produkcyjna.

+0

W jaki sposób można pokonać to ograniczenie? Mam ten sam problem. uzyskanie błędu certyfikatu z przeglądarki przed przekierowaniem. –

-7

O ile jestem świadomy prosty Meta Refresh działa również bez powodowania błędów:

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'"> 
+11

Pragnęlibyśmy, aby wyborcy byli zmuszeni zostawić komentarze wyjaśniające powody głosowania w dół. Osobiście nie wybrałbym tej odpowiedzi, chyba że jako programista nie miałeś dostępu do serwera, na którym pracowałeś, ale miałeś dostęp do strony. Jednym z problemów jest to, że będziesz musiał kodować każdą ścieżkę na każdej stronie, aby to działało. Jeśli możesz założyć, że JavaScript jest włączony dla twoich ważnych przypadków użycia, lepiej byłoby użyć JavaScript do zmiany na http. Powyższe odpowiedzi są lepsze, ponieważ nie wymagają obsługi javascript, ponieważ występują na serwerze. – Rustavore

+2

Po prostu: ponieważ htaccess jest znacznie lepszym rozwiązaniem niż to. Ponadto, nie rozwiąże problemu, aby przekierować protokół https do http, jeśli nie masz certyfikatu. – miduga

+1

Czynność powinna zostać przetworzona przez serwer, a nie "a", który może służyć. – albal

11

podstawie odpowiedzi ejunker, jest to rozwiązanie działa na mnie, nie na jednym serwerze, lecz na chmura środowisko

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

Jeśli żadne z powyższych rozwiązań nie działa dla Ciebie (nie dla mnie) tutaj jest to, co działało na moim serwerze:

RewriteCond %{HTTPS} =on 
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301] 
+6

Często nie będziesz potrzebować 'L,' (co oznacza "Ostatnia reguła"). Jeśli używasz WordPressa lub innego CMS-a, flaga 'L' może uniemożliwić prawidłowe przesłanie żądania strony. Zamiast tego użyj: 'RewriteRule^(. *) $ Http: //% {HTTP_HOST}/$ 1 [R = 301]' – Rustavore

6

Dla tych, którzy używają pliku .conf.

<VirtualHost *:443> 
    ServerName domain.com 
    RewriteEngine On 
    RewriteCond %{HTTPS} on 
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} 

    SSLEngine on 
    SSLCertificateFile /etc/apache2/ssl/domain.crt 
    SSLCertificateKeyFile /etc/apache2/ssl/domain.key 
    SSLCACertificateFile /etc/apache2/ssl/domain.crt 

</VirtualHost> 
1

Lepiej jest unikać używania mod_rewrite, kiedy możesz. W twoim przypadku chciałbym wymienić Rewrite z tym:

<If "%{HTTPS} == 'on'" > 
      Redirect permanent/http://production_server/ 
    </If> 

Dyrektywa <If> jest dostępny tylko w wersji 2.4+, jak na tym blog here

3

wszystkie powyższe nie działa, gdy użyłem CloudFlare, ten pracował dla mnie:

RewriteCond %{HTTP:X-Forwarded-Proto} =https 
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

i ten na pewno działa bez pełnomocnictw w drodze:

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

Żadna z odpowiedzi nie działa dla mnie w witrynie Wordpress, ale po wykonaniu (jest podobna do innych odpowiedzi, ale ma niewielką zmianę)

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