2008-08-12 12 views
136

Comment rediriger HTTPS vers HTTP ?. C'est le contraire de ce que (apparemment) tout le monde enseigne.Comment rediriger HTTPS vers HTTP?

J'ai un serveur sur HTTPS pour lequel j'ai payé une certification SSL et un miroir pour lequel je ne l'ai pas et que je garde pour les urgences, donc ça ne mérite pas d'être certifié.

Sur les ordinateurs de mon client, j'ai quelques raccourcis qui pointent vers http://production_server et https://production_server (les deux fonctionnent). Cependant, je sais que si mon serveur de production tombe en panne, alors le transfert de DNS entrera en action et les clients qui ont "https" sur leur raccourci regarderont https://mirror_server (qui ne fonctionne pas) et un gros écran rouge Internet Explorer 7 de mal à l'aise pour mon entreprise.

Malheureusement, je ne peux pas changer cela au niveau du client. Ces utilisateurs sont très analphabètes: ils risquent très probablement de voir des erreurs "d'insécurité" de HTTPS (surtout la façon dont Firefox 3 et Internet Explorer 7 le manipulent de nos jours: FULL STOP, heureusement, mais ne m'aide pas ici LOL).

C'est very easyto findApache solutions pour http->https redirection, mais pour la vie de moi, je ne peux pas faire le contraire.

Des idées?

Répondre

114

Cela n'a pas été testé mais je pense que cela devrait fonctionner en utilisant mod_rewrite

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

Comment puis-je le faire fonctionner (que dois-je changer de ce code à mon domaine pour faire fonctionner ce code)? – Enve

+1

Enve: Ajoutez simplement la configuration vhost_ssl.conf de votre site (ou .htaccess à la racine du site). Rien ne doit être changé, il utilisera dynamiquement le même nom d'hôte et le même chemin d'URL. – Meogi

+1

Je pense que vous pourriez aussi vouloir attraper des chaînes de requête. Je ne suis pas sûr, mais je pense que l'extrait ci-dessus ne transmettra pas les chaînes de requête de https à http. – Rustavore

64

Gardez à l'esprit que le moteur Réécrire démarre en une seule fois la requête HTTP a été reçue - ce qui signifie que vous auriez encore besoin d'un certificat , pour que le client établisse la connexion pour renvoyer la requête!

Toutefois, si la machine de secours semble avoir le même nom d'hôte (en ce qui concerne le client), il ne devrait pas y avoir de raison de ne pas utiliser le même certificat que la machine de production principale.

+0

Comment cette limitation peut-elle être surmontée? J'ai le même problème. obtenir l'erreur certifcate du navigateur avant la redirection. –

-7

Pour autant que je suis au courant d'un simple meta refresh fonctionne aussi sans erreurs causant:

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

Je souhaite que les électeurs soient tenus de laisser des commentaires expliquant les raisons des votes négatifs. Personnellement, je ne choisirais pas cette réponse à moins que vous, en tant que développeur, n'ayez pas accès au serveur pour lequel vous étiez en train de développer, mais que vous avez eu accès à la page. Un problème, c'est que vous devrez coder en dur chaque chemin sur chaque page pour que cela fonctionne. Si vous pouvez supposer que JavaScript est activé pour vos cas d'utilisation importants, il serait préférable d'utiliser JavaScript pour passer à http. Les réponses ci-dessus sont meilleures car elles ne nécessitent pas de javascript puisqu'elles se produisent sur le serveur. – Rustavore

+2

Simplement: parce que htaccess est bien meilleure option que cela. En outre, il ne va pas résoudre le problème de rediriger le protocole https à http si vous n'avez pas de certificat. – miduga

+1

L'action doit être traitée par le serveur et non par un document qu'elle peut servir. – albal

11

Sur la base de la réponse de ejunker, cela est la solution de travail pour moi, pas sur un seul serveur, mais sur un nuage enviroment

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

4

Si aucune des solutions ci-dessus fonctionne pour vous (ils ne l'ont pas pour moi) voici ce qui a fonctionné sur mon serveur:

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

Souvent, vous ne voudrez pas le 'L,' (qui signifie "Dernière règle"). Si vous utilisez Wordpress ou un autre CMS, l'indicateur 'L' peut empêcher la demande de la page d'être correctement routée. Au lieu de cela, utilisez: 'RewriteRule^(. *) $ Http: //% {HTTP_HOST}/$ 1 [R = 301]' – Rustavore

6

Pour ceux qui utilisent un fichier .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

Il est préférable d'ovoid en utilisant mod_rewrite lorsque vous le pouvez. Dans votre cas, je remplacerais le Rewrite avec ceci:

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

La directive <If> est uniquement disponible dans Apache 2.4+ selon cette blog here

3

tout ce qui précède ne fonctionne pas quand je cloudflare, celui-ci a fonctionné pour moi:

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

et celui-ci fonctionne vraiment sans procuration de la manière:

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

Aucune des réponses ne fonctionne pour moi sur le site Wordpress mais en suivant les travaux (c'est similaire aux autres réponses mais avec un petit changement)

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