Pude configurar un enlace desde una página HTTPS a una página HTTP en otro dominio y aún pasar la URL de la primera página como referencia usando la siguiente técnica.
Definiciones
Página de origen : página HTTPS donde se encuentra el enlace a la página de destino alojada HTTP. En este ejemplo:https://example1.com/origin.html
Página de destino : página HTTP que tiene acceso al referente de la página de origen. En este ejemplo:http://example2.com/destination.html
Plan basico
Esto tiene el efecto de hacer que la redirección provenga de la versión HTTP de la página de origen:
El enlace en la página de origen HTTPS enlaza con la página actual pero agrega un parámetro de consulta para la página de destino [1]. p.ej:https://example1.com/origin.html?goto=http://example2.com/destination.html
Cuando se hace clic en el enlace, el servidor de example1.com interrumpe la solicitud estándar cuando el parámetro de consulta 'goto' está presente. Entonces:
- Almacena el parámetro 'goto' en una cookie 'goto'.
- Elimina el parámetro y el valor 'goto' de la url de la solicitud actual
- 302 redirige a esta nueva url limpia en la versión HTTP del dominio de origen, es decir.
http://example1.com/origin.html
El servidor verifica cada solicitud de una cookie 'goto' y, si está presente, borrará la cookie y luego mostrará una página de redireccionamiento muy simple. Esta página contiene [2]:
- Una secuencia de comandos Javascript window.location.replace () que redirige a la URL de la cookie goto.
- Una etiqueta Meta Refresh con el valor de la URL de la cookie goto y un retraso de unos segundos.
- Un enlace a la URL de la cookie goto.
Notas
[1] Esta solución básica es un redireccionador abierto y se debe considerar la posibilidad de protegerse contra los malos usando el parámetro goto query para redirigir los UA en ataques de phishing.
[2] No todos los navegadores enviarán el referente al redirigir mediante una etiqueta de redireccionamiento JS o meta refresco. En mis pruebas, IE8 y versiones inferiores no pasan el referente.
No estoy seguro de si esta técnica permitirá a los rastreadores de motores de búsqueda seguir los enlaces. Esto no es importante para mis requisitos.
Si el UA tiene las cookies deshabilitadas, esto solo redirigirá a la página de origen nuevamente.
Permitir conexiones HTTP solo para redireccionamientos
En mi servidor tengo una regla de Apache para aplicar HTTPS independientemente de la solicitud:
<VirtualHost *:80>
ServerName example1.com
# if not on port 443 then 301 redirect to https while keeping any query string
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example1\.com$ [NC]
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,QSA,R=301]
Para que la técnica de redireccionamiento anterior funcione, necesito alguna forma de permitir condicionalmente las conexiones HTTP. Hay muchas maneras de hacer esto. Decidí que una cookie funcionará.
<VirtualHost *:80>
ServerName example1.com
# if not on port 443 then 301 redirect to https while keeping any query string
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example1\.com$ [NC]
RewriteCond %{SERVER_PORT} !443
RewriteCond %{HTTP_COOKIE} !disable_ssl [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,QSA,R=301]
La cookie disable_ssl se establecería en el paso 2 y luego se eliminaría en el paso 3.
Origin
debe estar intacto, aunque puede no ajustarse a su caso de uso.