$ _POST变量在IE7中通过一个子文件夹来空
我在PHP网站中的表单中收到$ _POST变量时遇到了麻烦。
为了澄清这个问题,我创造了这个简单的PHP脚本“POST_test.php”:
<?
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>
比方说,我的Apache Web根目录是“WEB_ROOT”,和我的网站文件夹是“websiteA”。将上面的脚本放在“web_root/websiteA”中,然后单击IE7中的按钮将产生一个空的$ _POST数组。将文件夹名称更改为“web_root/websiteA2”使其开始工作,并且还可以在Web根目录中的其他网站(例如“websiteB”)中工作。使用Firefox时没有问题。最近,NTLM身份验证在我们的系统中启用 - 我不知道这是否会有所作为。
Apache & PHP运行在运行Debian Linux(稍微旧版本)的服务器上。
我也尝试了IE浏览器页面的ctrl-refresh,这并没有帮助,也没有重新启动我的电脑。
更新:这个论坛帖子出现对问题进行描述: http://lists.rubyonrails.org/pipermail/rails/2006-March/027283.html
- 您不能发布任何数据混合 NTLM和非NTLM身份验证的Web站点 。在您访问 一个经过NTLM认证的 网站文件夹后,Microsoft Internet Explorer 需要NTLM身份验证才能访问网站的所有 。
如下我可以证实这种行为:
当我访问http://mydomain/websiteA/index.php然后http://mydomain/websiteA/POST_test.php $ _ POST没有提交测试页填充。
但是,关闭我所有的IE7窗口然后直接浏览到http://mydomain/websiteA/POST_test.php显示$ _POST是通过提交测试页面填充的。
而且从上面链接论坛上发帖建议的解决方案之一似乎是:
我所看到的让IE浏览器 的唯一途径“忘记”它曾 NTLM身份验证的网站发送401页面状态。这个 有效地重置IE认证状态。
感谢您的建议。
原来,这个问题是由先前请求无关的网页,其中利用NTLM身份验证的是这样的(或类似)引起的:
<?php
if (!isset($headers['Authorization'])){
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: NTLM');
exit;
}
?>
之后验证已完成,所有的$ _ POST数据在IE关闭并重新开放之前收到了空白。到目前为止,我已经通过删除上面的代码解决了这个问题,而是安排Apache在我们的Intranet中使用NTLM(设置$ _SERVER ['REMOTE_USER']变量)。 (在我们的Intranet之外,Apache身份验证仍在使用)。
谢谢你一样我的生活 – 2013-08-06 06:37:05
试着填充你的“行动”attibute,因为我不认为实际上会在IE7中离开这个属性为空。
更改脚本使action =“POST_test.php”给出相同的结果。 – 2011-03-22 00:49:20
它通常有效,但它在旧版本的Safari中存在缺陷。要解决Safari问题,可以使用'?'值。 – alex 2011-03-22 00:52:33
这个问题可以通过在IE中停用预认证被合作周围。在注册表中:
"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
在编辑菜单,添加值名称DisableNTLMPreAuth
作为一种REG_DWORD
和数据值设置为1(true)。
欲了解更多信息,请参阅this bug report和Microsoft KB 251404。
但是,如果这只适用于客户端,它是没有用的网络开发人员,对不对? – 2012-07-18 08:07:19
鉴于O.P.实际上没有提出一个问题,我认为没有理由对投票结果进行倒签投票。在某些情况下,这种解决方法可能完全可以接受。 – 2013-10-04 07:45:44
工作很努力,我已经找到了这个问题的把戏。我用了整个NTLM身份验证代码,在我的PHP一个包括文件,其中的验证完成之后,我不能让因混合NTLM和非NTLM问题,这可能改变页面的标题任何形式的POST。
,所以你必须做的就是包括相同的NTLM身份验证码,在网站的每个页面的起点,也将这样的伎俩。
问题就解决了...... :)
希望这帮助了很多人。
谢谢,但如果您有不想编辑的第三方应用程序,这不太好。 – 2012-11-21 18:43:03
感谢您的回复,但研究了很多后,我已经什么也没发现,到目前为止..除此之外还有另一种解决方案通过编辑Windows注册表值,其在大多数情况下是不能被接受的用户或可访问。 – Sabbir 2012-11-22 04:45:54
哦附加信息。在谷歌有人在谈论使用Cookie存储NTLM信息,然后发送一个请求401来清除NTLM标题,然后使用cookie来获得您想要的信息和方法,当你明确了UR NTLM头,它不会与POST方法混淆。但我发泄尝试了它,甚至不能找到链接..所以如果有人试图获得任何成功,请在此处放下它.. – Sabbir 2012-11-22 04:52:36
请问如果你改变了'action'属性的值,以'?'工作? – alex 2011-03-22 00:32:11
否 - 该URL只是获取?最后,但结果是一样的。 – 2011-03-22 00:50:26
这描述了一个POST数据与NTLM的问题: http://lists.rubyonrails.org/pipermail/rails/2006-March/027283.html 我会尝试一些测试以查看行为是否相似 – 2011-03-22 01:02:46