ブラウザから文句言われずにHTTPSからHTTPのページに移動させたいって話、まだあるんですね

むかーしから、HTTPSのログイン処理直後にHTTPのページにリダイレクトさせようとするとIE6で何か言われる的な話がありました。

IE9とかいってる今日この頃ですが、そう簡単にIE6の呪いから逃げるわけにいきませんので、頑張って対応してる人もたくさんいるでしょう。
上リンク先でも話に出ている、Y!のログイン直後の挙動を注意深く覗いてどーやっているかをまとめておきます。

HTTPSからHTTPSへのリダイレクト

例:Y!のトップページ(http://www.yahoo.co.jp/)のどこかにある「ログイン履歴を確認」リンクをたどり、ログイン直後にHTTPSのページにいく。

HTTP/1.1 302 Found
Location: https://lh.login.yahoo.co.jp/?.done=http://www.yahoo.co.jp/

普通ですね。

HTTPSからHTTPへのリダイレクト

例:Y!のトップページ(http://www.yahoo.co.jp/)からログインして戻ってくる。
このとき、HTTP Headerを見ると、

HTTP/1.1 200 OK
↑ 302ではない

ってなってます。上と違う実装になっているわけです。
このときのHTMLを見ると、こんなんなってるみたいです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script language="JavaScript">
<!--
window.location.replace("http://www.yahoo.co.jp/");
// -->
</script>
<meta http-equiv="Refresh" content="0; url=http://www.yahoo.co.jp/">
</head>
<body>
<a href="http://www.yahoo.co.jp/">http://www.yahoo.co.jp/</a>へジャンプしようとしています。
自動的にページが切り替わらない場合には、<a href="http://www.yahoo.co.jp/">こちら</a>をクリックしてください。</body>
</html>
  • meta refreshですっとばす
  • JavaScriptも書いてある
  • JavaScript Offの人もいるのでAタグ+文言も書いてある

なるほど。

試してみる

同じように実装してみました。

sample : https://r-weblife.sakura.ne.jp/php-quietredirection/test.php
gist : http://gist.github.com/586865

動かして試してみましょう。
あ、IE6入ってない。

なんでこんな話を?

最近はやりのOAuthやOpenIDとかやっていると、SP/OP/AuthZ Server側はHTTPSで処理するところがほとんどですが、RP/Consumer/Client側はHTTPのところが多いです。
OAuthのCallbackやOpenIDのreturn_toに返す時に、対応ブラウザを広く取っておくところは今回のような話がたくさん出てくるのではないかと。
「IE6で警告出るじゃねーか!対応しろや」って言われたくないところは、こんな方法を検討してみてはどうでしょうか?