在表单上传后使用header()重定向时,如果重定向中有#,则它在MSIE中消失,但在其他浏览器中正常工作。我以下面的简单脚本为例:
<?php
if (isset($_REQUEST["description"])) {
$location = "http://localhost/#someanchor";
header("Location: $location");
exit;
}
?>
<!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>
<title>PHP header redirect with #</title>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div>
<form enctype="multipart/form-data" method="post" action="<?php echo $_SERVER["PHP_SELF"]?>">
<div>
Description <input type="text" name="description" /><br /><br />
File <input type="file" name="uploadfile" /><br /><br />
<input type="submit" />
</div>
</form>
</div>
</body>
</html>
在Firefox和其他浏览器中,它会重定向到http://localhost/#someanchor
在MSIE中,它会重定向到http://localhost(失去锚点)
如果删除文件输入,那么它也适用于MSIE! (但我需要上传文件)
我可以使用Javascript解决这个问题,但也许我在这里缺少一些东西?
答案 0 :(得分:2)
这是IE严格执行RFC的罕见情况之一。在位置标题中,您must发送'绝对uri',定义为here:
absoluteURI = scheme ":" ( hier_part | opaque_part )
所以,没有片段(#)。
请参阅this question以获得更广泛的答案。
答案 1 :(得分:0)
不要在标头位置发送哈希值。相反,请使用元重定向。
答案 2 :(得分:-1)
我找到了以下解决这个问题的方法:
而不是
header("http://localhost/#bottom");
我用Javascript写道:
<script>
function go2url() {
window.location='http://localhost/#bottom';
}
window.setTimeout('go2url();', 200);
</script>
适用于IE8。