Sono stato in grado di impostare un collegamento da una pagina HTTPS a una pagina HTTP su un altro dominio e ancora passare l'URL della prima pagina come referrer utilizzando la seguente tecnica.
definizioni
Pagina di origine : pagina HTTPS in cui si trova il collegamento alla pagina di destinazione ospitata HTTP. In questo esempio:https://example1.com/origin.html
Pagina di destinazione : pagina HTTP che ha accesso al referrer della pagina di origine. In questo esempio:http://example2.com/destination.html
Piano di base
Ciò ha l'effetto di far sì che il reindirizzamento provenga dalla versione HTTP della pagina di origine:
Il collegamento alla pagina di origine HTTPS si collega alla pagina corrente ma aggiunge un parametro di query per la pagina di destinazione [1]. per esempio:https://example1.com/origin.html?goto=http://example2.com/destination.html
Quando si fa clic sul collegamento, il server su example1.com interrompe la richiesta standard quando è presente il parametro di query 'goto'. Allora:
- Memorizza il parametro 'goto' in un cookie 'goto'.
- Rimuove il parametro 'goto' e il valore dall'URL della richiesta corrente
- 302 reindirizza a questo nuovo URL pulito sulla versione HTTP del dominio di origine, ad es.
http://example1.com/origin.html
Il server verifica ogni richiesta di un cookie "goto" e, se presente, cancella il cookie e quindi rende una pagina di reindirizzamento molto semplice. Questa pagina contiene [2]:
- Uno script Javascript window.location.replace () che reindirizza all'URL del cookie goto.
- Un tag Meta Refresh con il valore dell'URL del cookie goto e un ritardo di alcuni secondi.
- Un link all'URL del cookie goto.
Appunti
[1] Questa soluzione di base è un redirector aperto e si dovrebbe prendere in considerazione la protezione contro i cattivi usando il parametro goto query per reindirizzare gli UA negli attacchi di phishing.
[2] Non tutti i browser invieranno il referrer durante il reindirizzamento tramite un reindirizzamento JS o un tag meta refresh. Nel mio test IE8 e inferiori non passa il referrer.
Non sono sicuro che questa tecnica consentirà ai crawler dei motori di ricerca di seguire i link. Questo non è importante per le mie esigenze.
Se UA ha i cookie disabilitati, questo reindirizzerà di nuovo alla pagina di origine.
Consentire connessioni HTTP solo per reindirizzamenti
Sul mio server ho una regola Apache per imporre HTTPS indipendentemente dalla richiesta:
<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]
Affinché la tecnica di reindirizzamento sopra funzioni, ho bisogno di un modo per consentire condizionalmente le connessioni HTTP. Ci sono molti modi per farlo. Ho deciso che un cookie funzionerà.
<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]
Il cookie disable_ssl verrebbe impostato nel passaggio 2 e quindi eliminato nel passaggio 3.
Origin
dovrebbe essere integro, non può andare bene il vostro caso d'uso però.