单击链接有时会导致“打开文件”对话框,而不是导航到页面


Clicking a link sometimes causes Open File dialog instead of navigating to the page

我有一些PHP文件在运行PHP 5.3.6的Unix服务器上运行。这些文件确实会检查会话变量,以确保对它们的访问安全。这种方法过去对我有效,在这里大部分时间都有效。

我遇到的问题是,有时在浏览网站时,会出现"打开文件"对话框,而不是浏览器导航到该页面。提供下载的文件是一个php文件,与您列出的文件同名,但为0字节。如果你点击取消并再次点击链接,通常情况下一切都会很顺利。然而,例如,如果您正在提交表单信息,这是一个问题。

在过去,我偶尔会遇到这个问题,甚至在其他使用PHP构建的公司网站上看到过几次(Facebook已经做了两三次),但没有我在这个特定网站上看到的那么频繁。

<?php
session_start();
$_SESSION['admin'] = 1;
header('Location: policy.php');

是会话设置方式的一部分(省略了实际的凭据检查,因为该示例不需要它)。

<?php
require "../php/secure.php";

是每个"安全"页面的顶部。secure.php的内容是:

<?php
session_start();
if( $_SESSION['admin'] != 1 )
{
    header('Location: index.php');
}

这是完整的secure.php文件,没有关闭?>。

任何关于为什么会发生这种情况的想法都将不胜感激,我无法想出任何原因来解释为什么这种情况只会在某些时候发生,而且在其他方面都很完美。

谢谢。

您应该使用像fiddler2或FireFox插件TamperData这样的HTTP检查器来查看请求和响应。通常,以下两种情况之一会导致这种情况:

  1. 您正在发送一个标头,指示应下载该类型,而不是在浏览器中显示该类型
  2. 您正在编写一些浏览器认为无法呈现的数据(例如,ASCII值小于30(0x1D)的字节,这些字节被视为控制字符,不适合打印)