HTTPSページから別のドメインのHTTPページへのリンクを設定し、次の手法を使用して、最初のページのURLを参照元として渡すことができました。
定義
元のページ:HTTPでホストされている宛先ページへのリンクが配置されているHTTPSページ。この例では:https://example1.com/origin.html
リンク先ページ:リンク元ページの参照元にアクセスできるHTTPページ。この例では:http://example2.com/destination.html
基本計画
これには、リダイレクトが元のページのHTTPバージョンから来るようにする効果があります。
HTTPS発信元ページのリンクは現在のページにリンクしますが、宛先ページのクエリパラメータを追加します[1]。例えば:https://example1.com/origin.html?goto=http://example2.com/destination.html
リンクをクリックすると、クエリパラメータ 'goto'が存在する場合、example1.comのサーバーが標準リクエストに割り込みます。それから:
- 「goto」パラメーターを「goto」Cookieに保管します。
- 現在のリクエストのURLから「goto」パラメータと値を削除します
- 302は、元のドメインのHTTPバージョンのこのクリーンアップされた新しいURLにリダイレクトします。
http://example1.com/origin.html
サーバーはすべてのリクエストで「goto」Cookieをチェックし、存在する場合はCookieをクリアして、非常に単純なリダイレクトページをレンダリングします。このページには[2]が含まれています:
- goto cookie urlにリダイレクトするJavascript window.location.replace()スクリプト。
- goto cookie urlの値と数秒の遅延を含むメタリフレッシュタグ。
- goto cookieのURLへのリンク。
ノート
[1]この基本的な解決策はオープンリダイレクタであり、フィッシング攻撃でUAをリダイレクトするためにgotoクエリパラメータを使用して悪意のある人から保護するためにいくつかの考慮が必要です。
[2] JSリダイレクトまたはメタリフレッシュタグを介してリダイレクトするときに、すべてのブラウザがリファラーを送信するわけではありません。私のテストでは、IE8以下はリファラーを通過しません。
この手法で検索エンジンのクローラーがリンクをたどることができるかどうかはわかりません。これは私の要件にとって重要ではありません。
UAでCookieが無効になっている場合、これは単に元のページにリダイレクトされるだけです。
リダイレクトのためだけにHTTP接続を許可する
私のサーバーには、リクエストに関係なくHTTPSを適用するためのApacheルールがあります。
<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]
上記のリダイレクト手法が機能するためには、条件付きでHTTP接続を許可する方法が必要です。これを行うには多くの方法があります。私はクッキーがうまくいくと決めました。
<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]
disable_ssl Cookieはステップ2で設定され、ステップ3で削除されます。
Origin
しかし、あなたのユースケースに適合しない場合があり、そのままでなければなりません。