考虑以下情况。用户提交包含文件输入字段的表单。然后,在处理完上传后,服务器将浏览器重定向到包含#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。当文件输入替换为文本输入时,问题就消失了。
这是一个错误还是某种安全措施?有解决方法吗?