¿Cómo redirige HTTPS a HTTP?

166

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

Tengo un servidor en HTTPS para el que pagué una certificación SSL y un espejo para el que no lo he hecho y lo mantengo solo para emergencias para que no merezca obtener una certificación.

En los escritorios de mi cliente tengo ALGUNOS atajos que apuntan http://production_servery https://production_server(ambos funcionan). Sin embargo, sé que si mi servidor de producción se cae, entonces el reenvío de DNS entra en acción y los clientes que tienen "https" en su acceso directo estarán mirando https://mirror_server(que no funciona) y una gran pantalla roja de inquietud de Internet Explorer 7 para mi empresa

Desafortunadamente, no puedo simplemente cambiar esto a nivel del cliente. Estos usuarios son muy analfabetos informáticos: y es muy probable que se asusten al ver errores de "inseguridad" HTTPS (especialmente la forma en que Firefox 3 e Internet Explorer 7 lo manejan hoy en día: PARADA COMPLETA, algo agradecida, pero no me ayuda aquí LOL).

Es muy fácil encontrar soluciones de Apache para la redirección http-> https , pero por mi vida no puedo hacer lo contrario.

Ideas?

mauriciopastrana
fuente
2
No hagas eso ! Los redireccionamientos HTTPS desde HTTP son extremadamente peligrosos (y de hecho serán bloqueados por todos los navegadores pronto debido a abusos), espacialmente si este es un nodo a través del estado HTTP silencioso (pero lo mismo es cierto si esto se hace mediante javascript), a menos que: - (1) hay una página de estacionamiento HTTPS transitoria que invita a los usuarios a mover un enlace haciendo clic activamente; o: - (2) el HTTPS redirige a HTTP exactamente en el MISMO dominio Y los redireccionamientos no cambian el tipo de contenido solicitado. Permitirlo en los navegadores ha permitido que muchos malwares pasen el aislamiento. Tales redirecciones son muy engañosas.
verdy_p
44
Esto parece un sitio interno, donde el OP sabe lo que está sucediendo con él y, por lo tanto, no es peligroso ... Si se tratara de un servidor web, estaría de acuerdo con usted, pero un servidor web interno y local, una redirección en Esta moda no sería un problema.
Stese
@verdy_p Estoy trabajando en redireccionamientos HTTPS a HTTP 302, el caso de los portales cautivos. ¿Me puede indicar la documentación a la que se refiere?
jprusakova
Para su portal cautivo, nunca realice una redirección HTTPS a HTTP 302, excepto si esto es exactamente al mismo dominio (ni siquiera un subdominio). Y como existe un alto riesgo de divulgación de información, ¡tenga cuidado con los tokens de sesión y las cookies que se transfieren de forma transparente con la redirección! Debe saber que los objetivos HTTP pueden modificarse y la información puede ser tomada por servidores proxy transparentes de malware e incluso por DNS malicioso: ¡su custodio ni siquiera puede saber que su objetivo HTTP solo será inalcanzable y realmente irá a un sombrero negro! Así que nunca haga eso en enlaces HTTPS que contienen sesión privada / cookies / solicitudes.
verdy_p
Dicha redirección HTTPS 302 siempre es un agujero de seguridad en su sitio HTTPS. El gran riesgo es que te roben las sesiones y que tus usuarios autenticados obtengan sus cuentas privadas. Y en todos los casos, NUNCA haga tales redireccionamientos para cargar javascripts o multimedia activa: esta es una puerta abierta en el reino de "sandbox" HTTPS. Realmente considere hacer algo al revés: redirija HTTP a HTTPS (especialmente su portal principal o páginas públicas estáticas que no necesitan datos / sesiones / cookies privadas) y use HTTPS para everelse. Si alguna vez necesita pasar de HTTPS a HTTP, use enlaces estándar (en solicitudes distintas)
verdy_p

Respuestas:

128

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

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
ejunker
fuente
1
¿Cómo lo hago funcionar (qué debo 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, utilizará dinámicamente el mismo nombre de host y ruta de URL.
Darren Felton el
1
Creo que también es posible que desee atrapar cadenas de consulta. No estoy seguro, pero creo que el fragmento anterior no reenviará cadenas de consulta de https a http.
Rustavore
12
Como señaló Kieron a continuación, esto no funcionaría si el servidor espejo no tiene un certificado válido. Aún vería una gran advertencia roja debido a un certificado no válido. Una vez que comienzas a usar https, básicamente estás atascado con él. Esté preparado para pagarlo durante el resto de su vida. Si deja de pagar, las personas que marcaron los enlaces https no podrán acceder.
Stephen Cheng
2
¿Pagando por el resto de tu vida? Todavía puede usar HTTPS, pero cambie su proveedor de PKI y obtenga nuevos certificados más baratos. Sí, pagará unos pocos dólares, ¡pero lo mismo es cierto para su nombre de dominio y su hosting! ¡Un certificado PKI ahora NO es caro en comparación con los nombres de dominio, y es insignificante en comparación con los costos de alojamiento / ancho de banda!
verdy_p
71

Tenga en cuenta que el motor Rewrite solo se activa una vez que se ha recibido la solicitud HTTP, lo que significa que aún necesitaría un certificado, para que el cliente configure la conexión para enviar la solicitud.

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

Kieron
fuente
1
¿Cómo se puede superar esta limitación? Tengo el mismo problema. obteniendo el error de certifcado del navegador antes de la redirección.
Sandeep Balagopal
Sería bueno tener una redirección de regreso a HTTP si hay un error de certificado
Jeffrey the Giraffe
Eso derrota por completo el propósito de tener HTTPS en primer lugar
FluffyBeing
12

Según la respuesta de ejunker, esta es la solución que funciona para mí, no en un solo servidor sino en un entorno en la nube

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
antoniom
fuente
Usar 301 puede ser poco peligroso. 301 significa eliminado de forma permanente y supongo que pasar de https a http es temporalmente. Vea esta respuesta aceptada para saber cuáles serán las desventajas para los usuarios stackoverflow.com/questions/1393280/…
yusuf tezel
La distinción 301/302 permanente / temporal solo es relevante para los motores de búsqueda.
matthewv789
9

Para aquellos que están usando un .confarchivo.

<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>
Almiar
fuente
8

Si ninguna de las soluciones anteriores funciona para usted (no lo hicieron para mí), esto es lo que funcionó en mi servidor:

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]
rg88
fuente
66
Muchas veces, no querrás el L,(que significa "Última regla"). Si está utilizando wordpress u otro CMS, el Lindicador puede evitar que la solicitud de página se enrute correctamente. En cambio, use:RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301]
Rustavore
5

todo lo anterior no funcionó cuando usé cloudflare, este funcionó para mí:

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

y este definitivamente funciona sin poderes en el camino:

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

Es mejor evitar usar mod_rewrite cuando puedas.

En su caso, reemplazaría la Reescritura con esto:

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

La <If>directiva solo está disponible en Apache 2.4+ según este blog aquí .

sys0dm1n
fuente
En un entorno alojado, uno puede verificar la versión de Apache usando/usr/sbin/httpd -v
Serge Stroobandt
1

esto funciona para mi

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
    Redirect "https://www.example.com/" "http://www.example.com/"
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # ... 
</VirtualHost>

asegúrese de escuchar los puertos 80 y 443.

jaxarroyo
fuente
0

Ninguna de las respuestas funciona para mí en el sitio web de Wordpress, pero los siguientes 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]
Yuseferi
fuente
No use tales reglas a ciegas con todos los REQUEST_URI (esto no debe usarse si hay datos de formulario en el URI o ID de cookies / sesiones en los metadatos de la solicitud). Úselo solo para páginas / imágenes públicas estáticas. Evítelo por completo para javascripts o componentes activos (en particular, secuencias de video con secuencias de comandos o archivos PDF activos a menos que estén firmados digitalmente por usted. Todavía no es posible firmar digitalmente javascripts, manténgalos solo en su dominio seguro).
verdy_p
Nota: algunos formatos de imagen son activos y programables: tenga cuidado con SVG, por ejemplo. Hemos visto ataques en algunos sitios web HTTPS que cargan imágenes SVG desde HTTP (con redireccionamientos 302 del sitio), y cosechados por malwares insertando scripts en contenido SVG ... Idealmente, los navegadores deberían aislar los subcontentos HTTP de HTTPS y colocarlos en un entorno limitado (entonces CORS las restricciones de seguridad también deberían aplicarse, incluso si está en el mismo nombre de dominio ...) por lo que "http: // (dominio) / ..." y "https: // (dominio) /" deben considerarse dominios distintos para CORS (no el mismo origen) incluso si están en el mismo número de puerto TCP.
verdy_p
@verdy_p, ¿qué quieres decir exactamente con eso "con los redireccionamientos 302 del sitio"? Primero debe tener el sitio del servidor (o los nodos participantes en el nivel TCP / IP, como servidores DNS, enrutadores), para explotar esas solicitudes de recursos HTTP, ¿verdad?
Sz.
No necesariamente. HTTPS en un dominio estará seguro, mientras que HTTP en el mismo dominio no lo estará (las vulnerabilidades no requieren el control de una IP o enrutadores, o servidores DNS incluso cuando se utiliza DNSSEC; las vulnerabilidades solo pueden usar la suplantación de IP, que no se puede detectar de forma segura sin HTTPS activado sesiones seguras). Por lo tanto, mantengo que un sitio HTTPS debe alojar imágenes (incluso en el mismo dominio) al no servirlas con HTTP (incluso se niega de forma predeterminada en algunos navegadores que requieren un clic de activación o enmascaran esas imágenes inseguras). Se debe prohibir HTTPS / HTTP mixto: el sitio es atacable en sus partes HTTP (por ejemplo, píxeles de seguimiento).
verdy_p
-6

Hasta donde sé, una simple actualización meta también funciona sin causar errores:

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">
RobinUS2
fuente
12
Deseo que los votantes que estén abajo tengan que dejar comentarios que expliquen las razones de los votos bajos. Personalmente, no elegiría esta respuesta a menos que usted, como desarrollador, no tuviera acceso al servidor para el que estaba desarrollando pero sí tuvo acceso a la página. Un problema es que tendrá que codificar cada ruta en cada página para que esto funcione. Si puede suponer que JavaScript está habilitado para sus casos de uso importantes, sería mejor usar JavaScript para cambiar a http. Las respuestas anteriores son mejores porque no requieren JavaScript ya que suceden en el servidor.
Rustavore
2
Simplemente: porque htaccess es una opción mucho mejor que eso. Además, no solucionará el problema para redirigir el protocolo https a http si no tiene un certificado.
midudev
1
El servidor debe procesar la acción, no "un" documento que pueda servir.
albal