Php $\对于一个子文件夹,IE7中的POST变量为空

Php $\对于一个子文件夹,IE7中的POST变量为空,php,apache,post,internet-explorer-7,Php,Apache,Post,Internet Explorer 7,我遇到了一个问题,PHP网站中的表单没有接收到$u POST变量 为了澄清这个问题,我创建了这个简单的PHP脚本“POST_test.PHP”: 假设我的Apache web根目录是文件夹“web_根目录”,我的网站文件夹是“websiteA”。将上述脚本放在“webroot/websiteA”中,并单击IE7中的按钮,将生成一个空的$\upost数组。将文件夹名称更改为“web_root/websiteA2”将使其开始工作,并且在web根目录下的其他网站(如“websiteB”)中也可以工

我遇到了一个问题,PHP网站中的表单没有接收到$u POST变量

为了澄清这个问题,我创建了这个简单的PHP脚本“POST_test.PHP”:


假设我的Apache web根目录是文件夹“web_根目录”,我的网站文件夹是“websiteA”。将上述脚本放在“webroot/websiteA”中,并单击IE7中的按钮,将生成一个空的$\upost数组。将文件夹名称更改为“web_root/websiteA2”将使其开始工作,并且在web根目录下的其他网站(如“websiteB”)中也可以工作。使用Firefox时没有问题。最近,我们的系统中启用了NTLM身份验证—我不知道这是否会产生影响

Apache和PHP运行在运行Debian Linux(有点旧的版本)的服务器上

我还尝试过在IE中按ctrl键刷新页面,但没有效果,重启电脑也没有效果

更新:此论坛帖子似乎描述了以下问题:

  • 您不能将任何数据发布到混合 NTLM和非NTLM身份验证Web 地点。Microsoft Internet Explorer 需要对所有用户进行NTLM身份验证 访问后访问网站 服务器的一个经过NTLM身份验证的文件夹 网站
  • 我可以确认这种行为如下:

    当我访问时,提交测试页面不会填充$u POST

    但是,关闭所有IE7窗口,然后直接浏览显示$\u POST是通过提交测试页面来填充的

    上面链接的论坛帖子中建议的解决方案之一似乎是:

    我所见过的唯一能让IE成功的方法 “忘记”它以前有过 通过站点身份验证的NTLM将发送401页状态。这 有效地重置IE身份验证状态


    尝试填写你的“动作”属性,因为我认为在IE7中保留此属性为空实际上是行不通的。

    谢谢你的建议

    事实证明,问题是由以前对不相关页面的请求引起的,该页面使用了NTLM身份验证,如下所示(或类似):

    
    

    验证完成后,在IE关闭并重新打开之前,所有$u POST数据都将接收为空。到目前为止,我已经解决了这个问题,删除了上面的代码,而是安排Apache在我们的Intranet中使用NTLM(它设置了$_SERVER['REMOTE_USER']变量)。(在我们的内部网之外,仍然使用Apache身份验证)。

    可以通过禁用IE中的预身份验证来解决此问题。在注册表中:

    在编辑菜单上,将值name
    DisableNTLMPreAuth
    添加为类型
    REG\u DWORD
    ,并将数据值设置为1(true)


    有关更多信息,请参阅和。

    经过努力,我找到了解决此问题的窍门。我在php中使用了整个ntlm身份验证代码作为一个包含文件,在该文件中完成了身份验证,之后我无法发布任何表单,因为ntlm和非ntlm问题混合在一起,这可能会更改页面的标题

    因此,您所要做的就是在站点的每个页面的开头都包含相同的ntlm身份验证代码,这样就可以做到这一点

    问题解决了……:)


    希望这能帮助很多人。

    如果将
    操作
    属性的值更改为
    ?不-URL只得到一个值,它是否有效?最后,结果是一样的。这说明了NTLM的POST数据存在一个问题:我将尝试一些测试,看看行为是否相似。您是否能够将
    $\u GET
    s传递给脚本~?这可能是某种标头截断吗?~将脚本更改为action=“POST_test.php”会得到相同的结果。它通常是有效的,但在较早版本的Safari中存在错误。要解决Safari问题,可以使用
    值。但是如果这只在客户端有效,那么对web开发人员来说是没有用的,对吧?既然O.P.实际上没有提出问题,我认为没有理由否决解决方案。在某些情况下,此解决方案是完全可以接受的。谢谢,但如果您有不想编辑的第三方应用程序,则此解决方案就不太好了。感谢您的回复,但在进行了大量研究后,我到目前为止未发现任何结果。。除此之外,还有另一种解决方案,即编辑windows注册表值,在大多数情况下,该值是用户无法接受或访问的。哦,其他信息。。谷歌上有人在谈论使用cookies存储ntlm信息,然后发送401请求以清除ntlm标题,然后使用cookie获取所需信息,这样当你清除你的ntlm标题时,它就不会干扰POST方法。但是我试过了,甚至再也找不到链接。。因此,如果有人尝试并取得任何成功,请把它放在这里。。
    <?
    print "POST:<pre>";
    print_r($_POST);
    print "</pre>";
    ?>
    <form method="POST" action="POST_test.php">
    <input type="submit" value="Save Changes">
    <input type="hidden" name="blah" value="1">
    </form>
    
    <?php
      if (!isset($headers['Authorization'])){
        header('HTTP/1.1 401 Unauthorized');
        header('WWW-Authenticate: NTLM');
        exit;
      }
    ?>
    
    "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Internet Settings"