PHP如何阻止Chrome加载页面两次

时间:2015-11-17 16:24:58

标签: php google-chrome session

  

注意:我已经更新并重写了我的问题,试图逐点解决这个问题。欢呼声。

我遇到了问题,我不能立即确定如何解决它。

我一直在HTTPS服务器上建立一个安全的登录系统(等级为#34; A"由SSL-labs提供,如果它有价值),它运行正常,但今天它拒绝登录我,通过一些调试,我发现了一些非常奇怪的东西(在我看来)。

我在网站上有会话处理方面的一些严重问题,不同的页面使用相同的会话数据(当然)和相同的会话/ cookie设置,并且它们之间正确地传递信息,但< / strong>我的浏览器的行为似乎有两个浏览器使用相同的会话数据访问相同的网站。

症状 - 因为我一直与页面生成的会话内容(唯一散列令牌)不一致,不适合登录表单中保存的相同数据(作为$_POST值),我发现因为只有在整个站点中设置会话值的一行,该行必须运行两次。所以我在会话中设置了一个计数器值,在表单页面上为session['counter']。每次页面加载时,计数器+ 1&#39; s。我的问题具体是这个:

登录页面:

Opens page,  
session hash-string is generated and saved to the post form.
session counter = counter + 1;
Form is filled in.

登录身份验证&#39;页面:

fails to verify the posted hash-string is the same as the session hash
 string, despite there being no other cause for the session values to
 change (well there must be, but I can't see it!)  

但是,然后回到登录页面我看到计数器=最后一个值+ 2!此外,保存在服务器上的会话文件中记录的计数器值始终为登录页面上显示的值+1。

一些图片:

enter image description here

登录表单页面:请注意,这位于HTML输出之上,并且是代码中 编辑任何SESSION数据的最后位置

输出:

enter image description here

请注意与图像1中的计数器相关的编号。

enter image description here

我的会话文件,这个文件与这个特定的浏览器会话有关,只有1个会话文件,因为我是网站上唯一的浏览器。

enter image description here

字符串CheckDrop是要比较的哈希值,但计数器位于 12 而不是11,这显示在上面的图像2中。

  • 虽然此工作位于子域,但我的网站已经过HTTPS验证。

  • 这个问题已经发生了3个小时,但不一致,它在今天早些时候(发布此帖子之前)大约40分钟神奇地工作了。但我没有做任何我能看到的改变环境的事情。

  • 我之前比较了phpinfo数据和会话设置数据,它们在浏览器输出时看起来都是正确的。它似乎不是由我的设置引起的。

  • 它发生在我电脑上的不同浏览器上。

进一步的工作

花了几个小时调试并完成此操作后,它似乎是一个浏览器问题。我已经重命名了这些页面(一个页面被称为索引,而它没有在.htaccess中定义为目录列表页面,可能可能导致浏览器打开它两次)。

我已经清除了所有相关数据:会话/数据库记录/浏览器历史记录,并且遇到了一些问题:

Firefox现在按预期登录,计数器计数+ 1并且登录正常工作,但是在Chrome上,同一页面上完全相同的登录不起作用,浏览器似乎加载两次,counter = counter + 2 。 Chrome在每次加载时都会在数据库中留下两条记录而不是预期的记录。

Chrome版本45.0.24 Firefox版本42.0

页面重复计算并在 Safari Chrome 上运行两次脚本。在Firefox,Opera和MSIE上,它按预期工作。

有关为何发生这种情况的任何想法

如何尝试解决此问题?

3 个答案:

答案 0 :(得分:5)

原始问题是由网页的命名引起的,有一个名为&#34; index.php&#34;但这个页面不是索引,而是&#34; loggedIn.php&#34;是.htaccess

中定义的网站的索引页面

拥有一个不是索引的index.php页面似乎让许多浏览器感到困惑。通过重命名所有页面并设置index.php页面来解决此问题的[部分],该页面使用PHP标头将人们重定向到合适的页面(基于登录与否)。

Chrome和Safari仍然存在问题。

经过很长一段时间阅读有关Chrome的许多问题,解决方案坦率地说是可悲的,

https://code.google.com/p/chromium/issues/detail?id=64810

此链接列出了与Chrome双重加载问题相关的各种问题,如果某些标记元素不存在。由于我上面的页面非常简单,因此没有应用,但Google Chrome会默默请求favicon.ico文件,然后如果找不到,则会重新加载页面但只输出第一页(来自Chrome内存缓存)。

这是Chrome中一个非常愚蠢的错误,它花了我一天的大部分时间。 Safari仍然会继续加载PHP脚本两次,

答案 1 :(得分:1)

我参加聚会可能有点晚,但是我发现了发生这种情况的另一个原因。我创建了以下页面:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <?php
    error_log('Loaded');
    ?>
</body>
</html>

即使这个最小的页面也加载了两次,但仅在Chrome中加载,所以我开始调查,发现Mendeley Web Importer Chrome扩展程序正在引起这种行为。只需禁用它即可为我解决问题。

答案 2 :(得分:-1)

我想你的问题出在Internet Explorer上......我遇到了同样的问题,我发现,令人难以置信的惊喜和震撼,Internet Explorer 10将发送一个不同的用户代理&#34;价值,从请求到请求。

当我第一次看到它时,我对这个事实的荒谬印象深刻,但这完全可以肯定。我对它进行了非常深入的测试,你无法信任Internet Explorer&#34;用户代理&#34;字符串与请求请求相同。

我必须从散列登录字符串中删除该字符串