iframeを使ってあるページを表示しようとした場合に、そのページがレスポンスとして「301 Moved Permanently」を返すと、親フレームごと移動先のページに遷移してしまうのですが、回避する方法はあるでしょうか?
例えば、以下のHTMLで「http://foo.bar/zoo/」が301を返すと、iframe内のコンテンツではなく、ウィンドウ全体がページ遷移してしまいます。
<html>
<body>
<iframe src="http://foo.bar/zoo/"></iframe>
</body>
</html>
ご質問の条件に合うような実験を試みましたが、現象が再現しません。iframe内は Yahoo!JAPAN へジャンプします。
もう少し具体的に状況をお知らせください。301先がCookieを要求したりSSLサイトだったりすると話が変わってきますので。
http://localhost/hoge.html(ローカル)
<html>
<body>
<iframe src="http:/xxxx/hoge/hogehoge.html"></iframe>
main
</body>
</html>
http://xxxx/hoge/hogehoge.html(インターネット上)
<html>
<body>
hogehoge
</body>
</html>
http://xxxx/hoge/.htaccess(インターネット上)
Redirect 301 / http://www.yahoo.co.jp/
サーバ環境:WindowsXP(SP3) + Apache 2.2.8
クライアント環境:WindowsXP(SP3)(サーバと同じ)+IE7/IE6/FireFox3/Safari3
詳しい情報をありがとうございます。現象を再現できました。
けれども、再現確認できただけで具体的な解決策をお示しできないので、ポイントは不要で結構です。
お気づきのように Locationヘッダの解釈問題なのですが、これはブラウザ依存します。先ほどと同じ WindowsXP(SP3) 環境では
再現できたもの‥‥IE6, IE7, FireFox3, Safari3
再現できないもの‥‥Opera9.2
となっています。
なお、httpの仕様書によると、"301 Moved Permanently" の際には
新しい恒久的 URI は、レスポンス内の Location フィールドによって与えられるべきである
とあるので、wikiwiki.jp のヘッダは適切です。
しかし困りましたね――iframe内が読み込まれる前にonloadをかけたとしても、JavaScriptでhttpヘッダをチェックするのは無理でしょうし、いちいちスクリプトを書くわけにも行かないでしょうし――やはり iframe は使うなということでしょうか(トホホ)。
回答ありがとうございます。
>もう少し具体的に状況をお知らせください。301先がCookieを要求したりSSLサイトだったりすると話が変わってきますので。
すみません。もう少し具体的に書きます。
質問の現象が発生するのは、以下のHTMLです。
-----
<html>
<body>
<iframe src="http://wikiwiki.jp/lua/"></iframe>
</body>
</html>
-----
このHTMLをFirefox3(WinXP)で開くと、ウィンドウ全体が「http://wikiwiki.jp/lua/」に遷移してしまいます。
telnetで直接アクセスしたところ、以下のようなレスポンスが返ってきました。
-----
~$ telnet wikiwiki.jp 80
Trying 202.61.22.173...
Connected to wikiwiki.jp.
Escape character is '^]'.
GET /lua HTTP/1.1
Host: wikiwiki.jp
HTTP/1.1 301 Moved Permanently
Date: Fri, 10 Oct 2008 03:43:48 GMT
Server: Apache
Location: http://wikiwiki.jp/lua/
Content-Length: 231
Content-Type: text/html; charset=iso-8859-1
<html><head>
<title>301 Moved Permanently</title>
(省略)
-----
301が返るレスポンスで共通に起きる現象かと思ったのですが、違うみたいですね。すみません。
-----
(追記)
Locationヘッダが原因ですかね…