J'ai pu configurer un lien d'une page HTTPS vers une page HTTP sur un autre domaine et toujours transmettre l'URL de la première page en tant que référent en utilisant la technique suivante.
Définitions
Page d'origine : page HTTPS où se trouve le lien vers la page de destination hébergée HTTP. Dans cet exemple:https://example1.com/origin.html
Page de destination : page HTTP qui a accès au référent de la page d'origine. Dans cet exemple:http://example2.com/destination.html
Plan de base
Cela a pour effet de faire en sorte que la redirection provienne de la version HTTP de la page d'origine:
Le lien sur la page d'origine HTTPS renvoie à la page actuelle mais ajoute un paramètre de requête pour la page de destination [1]. par exemple:https://example1.com/origin.html?goto=http://example2.com/destination.html
Lorsque le lien est cliqué, le serveur sur example1.com interrompt la demande standard lorsque le paramètre de requête «goto» est présent. Alors:
- Stocke le paramètre «goto» dans un cookie «goto».
- Supprime le paramètre et la valeur «goto» de l'URL de la demande actuelle
- 302 redirige vers cette nouvelle URL nettoyée sur la version HTTP du domaine d'origine ie.
http://example1.com/origin.html
Le serveur vérifie chaque demande de cookie «goto» et s'il est présent, il effacera le cookie et affichera une page de redirection très simple. Cette page contient [2]:
- Un script Javascript window.location.replace () qui redirige vers l'url du cookie goto.
- Une balise Meta Refresh avec la valeur de l'URL du cookie goto et un délai de quelques secondes.
- Un lien vers l'url du cookie goto.
Remarques
[1] Cette solution de base est un redirecteur ouvert et une certaine attention devrait être accordée à la protection contre les méchants en utilisant le paramètre de requête goto pour rediriger les UA dans les attaques de phishing.
[2] Tous les navigateurs n'enverront pas le référent lors de la redirection via une redirection JS ou une balise meta refresh. Dans mes tests IE8 et inférieur ne passe pas le référent.
Je ne sais pas si cette technique permettra aux robots des moteurs de recherche de suivre les liens. Ce n'est pas important pour mes besoins.
Si l'UA a désactivé les cookies, cela ne fera que rediriger vers la page d'origine.
Autoriser les connexions HTTP uniquement pour les redirections
Sur mon serveur, j'ai une règle Apache pour appliquer HTTPS quelle que soit la demande:
<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]
Pour que la technique de redirection ci-dessus fonctionne, j'ai besoin d'un moyen d'autoriser conditionnellement les connexions HTTP. Il existe plusieurs façons de procéder. J'ai décidé qu'un cookie fonctionnerait.
<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]
Le cookie disable_ssl serait défini à l'étape 2, puis supprimé à l'étape 3.
Origin
doit être intact, mais peut ne pas correspondre à votre cas d'utilisation.