header関数でページの指定した場所にリダイレクト出来ない

投稿日:

PHP でフォームデータの処理をした後にどこかのページにリダイレクトしたい場合なんかは、

header("Location: http://www.grimonet.com/")

などのように、header関数を使います。

で、リダイレクト先のページの中で特定の場所を表示したいのであれば、通常の aタグと同じように

header("Location: http://www.grimonet.com/index.php#grimo")

のような感じで指定します。

が・・・
IE の場合、本当に限られたケースだと思いますが、正しく動作しない事があるようです。

正しく動作しないといってもエラーが発生するわけではないのですが、前述のように #xxx といった感じで指定したものが無視されます。
指定した場所にジャンプしないのではなくて、アドレスバーにも出てきません・・・

前述の例で言うと
http://www.grimonet.com/index.php#grimo
となるはずの部分が、
http://www.grimonet.com/index.php
となってしまいます。

Firefox と Opera でも確認してみましたが、問題が発生するのは IE だけのようです。


ネットで調べてみたのですが、同様の現象に関する記述がなかったので環境に依存するかもしれませんが、問題が発生する条件は以下のような感じです。

  • リダイレクト先のURLに、ページの特定の場所を指定する#xxx(xxx は飛び先の ID など)が含まれている。
  • POST メソッドでデータを送信している。
  • フォーム内にアップロードファイル指定用のタグ(<input type="file" name="file_path" /> など)が入っている。
  • フォームタグで enctype="multipart/form-data" が指定されている。

ファイル指定用のタグを取ったり、enctype の記述をはずしたり、GET 送信した場合には IE でも問題なく指定箇所にジャンプします。
謎です。

解決方法としては、META タグで飛ばしたりする方法も考えられますが、めんどくさいので2段階でリダイレクトする事にしました。

  1. リダイレクト用の情報を含むパラメータを URL に埋め込んで一回リダイレクトする。
  2. ページ内の指定箇所へのリダイレクトを実行する。

スマートじゃないですが、しょうがない・・・
半日これで潰したので、作業が遅れ気味・・・

やばいなぁ・・・

更新日: