1

考虑以下情况。用户提交包含文件输入字段的表单。然后,在处理完上传后,服务器将浏览器重定向到包含#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。当文件输入替换为文本输入时,问题就消失了。

这是一个错误还是某种安全措施?有解决方法吗?

4

2 回答 2

1

I ended up using double redirect on IE 7/8. I replaced

header("Location: " . basename($_SERVER['PHP_SELF']) . "#test");

with

if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(^|[^a-zA-Z])(MSIE|msie) [678]($|[^\d])/', $_SERVER['HTTP_USER_AGENT'])) // If IE 6, 7 or 8
    header("Location: redirect.php?to=" . urlencode(basename($_SERVER['PHP_SELF']) . "#test"));
else    // For sane browsers
    header("Location: " . basename($_SERVER['PHP_SELF']) . "#test");

and created a simple redirection script redirect.php:

<?  if (isset($_GET['to']))
        header('Location: ' . $_GET['to']);
于 2013-06-10T16:29:01.373 回答
0

这是我在使用 javascript 实现 oauth 流时必须处理的互联网浏览器的一个奇怪之处。

似乎可以通过在主题标签前面直接放置一个斜杠来解决该问题。所以而不是file.php#werewwermakefile.php/#werwer

但是我不知道为什么......我认为它是一个错误。

主题标签旨在永远不会被传输到服务器。它只是客户端。我认为IE只是提前删除它......

另一种可能性是使用元重定向而不是标头重定向。这似乎行得通。您也可以使用 javascript 附加到 url...不知道这是否适合您的用例。

于 2013-06-09T19:02:32.250 回答