2008-08-12 43 views
136

¿Cómo redirige HTTPS a HTTP ?. Es decir, lo opuesto a lo que (aparentemente) todos enseñan.¿Cómo redirige HTTPS a HTTP?

Tengo un servidor en HTTPS para el que pagué una certificación SSL y un espejo que no tengo, y lo guardo solo para emergencias, por lo que no merece recibir una certificación.

En los escritorios de mi cliente, tengo ALGUNOS atajos que apuntan a http://production_server y https://production_server (ambos funcionan). Sin embargo, sé que si mi servidor de producción falla, el reenvío de DNS entra en acción y los clientes que tienen "https" en su atajo mirarán al https://mirror_server (que no funciona) y una gran pantalla roja de Internet Explorer 7 de intranquilidad para mi compañía

Desafortunadamente, no puedo cambiar esto en el nivel del cliente. Estos usuarios son muy analfabetos en informática: y es muy probable que se vuelvan locos al ver los errores de "inseguridad" de HTTPS (especialmente la forma en que lo manejan Firefox 3 e Internet Explorer 7: FULL STOP, afortunadamente, pero no me ayudaron aquí).

Es very easyto findApache solutions para http->https redirection, pero para la vida de mí no puede hacer lo contrario.

Ideas?

Respuesta

114

Esto no ha sido probado, pero creo que esto debería funcionar usando mod_rewrite

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

¿Cómo hago para que funcione (¿qué tengo que cambiar de este código a mi dominio para que este código funcione)? – Enve

+1

Enve: simplemente agregue a la configuración vhost_ssl.conf de su sitio (o .htaccess en la raíz del sitio). No es necesario cambiar nada, usará dinámicamente el mismo nombre de host y la misma ruta de url. – Meogi

+1

Creo que también podría querer buscar cadenas de consulta. No estoy seguro, pero creo que el fragmento de arriba no reenviará las cadenas de consulta de https a http. – Rustavore

64

Tenga en cuenta que el motor de reescritura sólo se activa una vez que la solicitud HTTP se ha recibido - lo cual significa que todavía necesitan un certificado , ¡para que el cliente configure la conexión para enviar la solicitud!

Sin embargo, si la máquina de copia de seguridad parecerá tener el mismo nombre de host (en lo que respecta al cliente), entonces no debería haber ninguna razón para no poder usar el mismo certificado que la máquina de producción principal.

+0

¿Cómo se puede superar esta limitación? Tengo el mismo problema. obteniendo el error de certifcación del navegador antes de la redirección. –

-7

Por lo que yo estoy al tanto de una simple meta de actualización también funciona sin errores, provocando:

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

Desearía que los votantes tuvieran que dejar comentarios que expliquen los motivos de los votos a la baja. Personalmente, no elegiría esta respuesta a menos que usted, como desarrollador, no tenga acceso al servidor para el que estaba desarrollando, pero sí tuvo acceso a la página. Un problema es que tendrás que codificar cada ruta en cada página para que funcione. Si puede suponer que JavaScript está habilitado para sus casos de uso importantes, sería mejor que use JavaScript para cambiar a http. Las respuestas anteriores son mejores porque no requieren javascript ya que ocurren en el servidor. – Rustavore

+2

Simplemente: porque htaccess es una opción mucho mejor que eso. Además, no arreglará el problema para redirigir el protocolo https a http si no tiene un certificado. – miduga

+1

La acción debe ser procesada por el servidor, no como un 'documento' que pueda servir. – albal

11

Sobre la base de la respuesta de ejunker, esta es la solución de trabajo para mí, no en un solo servidor, pero en una nube ambiente

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

Si ninguna de las soluciones anteriores funciona (no lo hicieron para mí) que aquí es lo que ha funcionado en mi servidor:

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

Muchas veces, no querrás el 'L,' (que significa "Última regla"). Si está utilizando wordpress u otro CMS, el indicador 'L' puede evitar que la solicitud de la página se enrute correctamente. En su lugar use: 'RewriteRule^(. *) $ Http: //% {HTTP_HOST}/$ 1 [R = 301]' – Rustavore

6

Para aquellos que están usando un archivo .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

Es mejor ovocar usando mod_rewrite cuando sea posible. En el caso de que sustituiría a la reescritura con esto:

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

La directiva <If> sólo está disponible en Apache 2.4+ según esta blog here

3

todo lo anterior no funciona cuando yo solía CloudFlare, éste trabajó para mí:

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

y éste definitivamente funciona sin proxies en la forma:

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

Ninguna de las respuestas funciona para mí en el sitio web de Wordpress, pero después de los trabajos (es similar a otras respuestas pero tiene un pequeño cambio)

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