次の状況を考えてみましょう。ユーザーは、ファイル入力フィールドを含むフォームを送信します。次に、アップロードを処理した後、サーバーはブラウザーを を含むアドレスにリダイレクトします#hash-part
。ブラウザがIE7/8の場合、ハッシュマーク以降の部分(#
自身も含む)を破棄します。さらに、実際のファイルのアップロードが行われたか、ユーザーがファイル フィールドを空のままにしたかに関係なく、これが行われます。次のコードはそれを示しています。
<? if (isset($_POST['sent'])) {
header("Location: " . basename($_SERVER['PHP_SELF']) . "#test");
die();
}
?><!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="sent" value="1" />
<input type="file" name="test" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
フォームが送信されると、IE 7/8 は以前と同じアドレス バーに同じアドレスを表示しますが、他のブラウザー (および IE 9/10) は index.php#test に適切にリダイレクトされます。ファイル入力をテキスト入力に置き換えると、問題はなくなります。
それはバグですか、それとも何らかのセキュリティ対策ですか?回避策はありますか?