PHP服务器发送cookie,浏览器接收它,但没有找到cookie

时间:2015-10-08 03:02:26

标签: php session firefox cookies apache2.2

我搜索过并搜索过,但似乎与我的问题无关。

在我的开发环境中,我有一些PHP脚本来为客户端生成HTML。我创建了自己的自定义会话管理器,我的代码中的所有内容都正常工作(到目前为止),直到我尝试在新会话上发送cookie。以下是一些提供想法的代码:

<?php
    class Session {
        private $data = null;
        private $id = null;
        private $token = null;
        private $access = null;
        private $oldID = null;
        private static $ck_limit = 180;
        private static $ck_domain = "kiosk.local.com";
...
        public function __construct() {
            setcookie("id", $this->id, (time() + self::$ck_limit), '/', self::$ck_domain, true, true);
        }

?>

根据Firebug,浏览器可以很好地获取cookie,但是在Cookie列表中,它无处可寻!页面刷新不执行任何操作,并且似乎没有cookie进入客户端存储。链接是绝对路径,通过HTTPS,证书永久存储和信任,并且在任何这些设置之间进行更改不会产生cookie。

我在同一个浏览器中使用谷歌测试了cookie接收,然后它们正常工作。

万一有人问,我的机器的主机名是kiosk.local.com的FQDN,我的主机文件将它映射到它的接口。这不是我的第一台服务器,但这是我第一次使用PHP处理cookie。

我确保在发送Cookie之前有 NOTHING 被发送到客户端,我尝试发送它没有任何内容,空页面和我定期发送的页面,并尝试过没有输出缓冲。

这有什么理由应该发生吗?我对apache的error.log没有说明cookie,PHP setcookie()方法返回true,Firebug报告页面加载时没有任何错误...... cookie列表中没有cookie。我可以在收到的标题中看到cookie数据,但这是服务器正在执行其工作的唯一指示。

浏览器是Firefox 40.0.3 for Ubuntu 12.04.3 LTS,扩展名是Firebug,FireQuery,来自子资源的Firefox HTTP身份验证Hotfix和Ubuntu Modifications。

1 个答案:

答案 0 :(得分:0)

我相信我今天早上预感到了答案。服务器的代码很好。我偶然遗漏的,因为我认为它对系统没有任何影响或影响,是客户端和主机是同一台机器,这意味着我从apache2服务器上的用户运行浏览器正在运行。我的项目是一个基于Web的独立应用程序,使用PHP和MySQL。我三重检查浏览器实际上正在请求正确的URL(我向我的外部客户端发送了相同的URL,因此这不是一个微不足道的错误。)

我认为问题在于,无论如何,如果浏览器或apache2服务器确定将cookie发送到与服务器同名的客户端,则cookie会在收到时被吃掉。不确定哪个服务正在吃cookie,但很明显Firefox报告在发送cookie后接收cookie,因此Apache正在吃它,或者Firefox正在使用它。

无论哪个是罪魁祸首,我都很清楚,cookie不能在同一主机/ IP的服务器/客户端上使用,至少在它们是Apache2.2.22和Firefox 40.0.3时,即使在使用时也是如此一个FQDN。

因此,简而言之,客户端服务器(难题)上的独立应用程序无法使用自己的cookie。

如果某人有其他原因导致这种情况发生,并且一个可行的解决方法不涉及规避安全措施或以其他方式危及应用程序,Web内容,网络或使用代理的安全性,我对此持开放态度。我说不需要代理,因为除了通过主机设备创建的无线AP进行管理员访问(没有路由器)之外,该程序是自包含的信息亭。有理由不讨论这个,只是接受这个设置不会改变的事实,并采取所有预防措施来确保这个特定设置的正确安全。

显然,如果cookie不能在以任何方式发送它们的同一主机上使用,我可能别无选择,只能引入另一台设备作为客户端,在完成之前我必须与项目经理讨论。不,虚拟机是不可能的,因为服务器上的硬件规格不够高,无法运行VM和主机,而且我认为不支持架构/平台组合作为VM主机。

:: EDIT ::

我找出了罪魁祸首,并解决了问题。请原谅我,因为我甚至发生了这样的事情......

<强> * * SLAP

好的,所以这就是两个浏览器之间的区别:

我的主机(对于运行dev服务器的虚拟机)浏览器设置为我通常使用的,记住历史记录,在正常情况下接受cookie,等等,等等,等等。但是,由于我希望开发环境尽可能地模拟生产环境以获得真实的反馈,我将浏览器设置为永远不会记住历史记录,并且不接受cookie,除了自助服务终端的域。显然,尽管该站点位于例外列表中,并且即使接受了所有cookie,但私有浏览也会丢弃标题中出现的所有cookie,并且不会因任何原因将其报告为拒绝。所以,没有办法看到为什么在浏览器获得后没有粘贴的cookie。虽然有一个奇怪的一点,我的外部主机Firefox浏览器即使在私密浏览中仍然会获得cookie ...奇怪的是它可以做到但内部客户端不能...

因此,将内部主机的firefox设置更改为正常浏览后,删除浏览器上关闭的所有浏览数据,此问题就解决了。这具有相同的最终结果,除了在我们根本不需要数据的情况下将 写入磁盘,但是在结束时删除了所有内容。那一天,这没什么大不了的。

所以,我会说Ubuntu x86_64的Firefox 40.0.3有一个错误,当设置中的隐私选项卡使用“始终使用隐私浏览模式”时,如果它们来了,没有cookie会超过标题接收从它自己的服务器面孔。您必须使用在浏览器关闭时删除浏览数据的变通方法,并确保定期关闭浏览器。问题现在解决了。