PHP - 在MSIE中带#中断的头重定向

时间:2011-10-08 09:34:40

标签: php

在表单上传后使用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解决这个问题,但也许我在这里缺少一些东西?

3 个答案:

答案 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。