在PHP中有没有办法识别F5刷新?

3

有没有办法使用PHP识别某人是否刷新了当前页面,而不是从其他地方到达。

我只能访问当前页面的代码,因此无法传递任何内容以检查其他地方的内容。


1
你想通过这个找到什么信息?为什么刷新很重要? - deceze
1
此内容已被翻译,无需再次翻译。 - Dan Blows
1
是的,它确实需要仅限于PHP,这样我就可以确保进行服务器端检查。我不相信用户没有禁用JavaScript。 - user114671
1
@Blowski,那个问题是关于JavaScript刷新的方式。 - user114671
如果没有解释“您想通过这个找到什么/为什么刷新很重要”,那么这通常不是一个真正的问题。投票关闭。 - Your Common Sense
显示剩余2条评论
5个回答

6

您的问题标题表明您特别想知道如何检测使用F5键刷新页面的方法。如果是这样,您肯定需要使用JavaScript来检测是否按下了该键。如果您不关心页面是如何刷新的,那么这个答案应该会有所帮助:https://dev59.com/1EbRa4cB1Zd3GeqPy0YO#456915。它考虑了完整的URL以及任何表单内容。


3

添加一个unload()事件,可以通过AJAX设置cookie或启动PHP会话。然后,在下次加载页面时,检查cookie或会话 - 如果它存在且非常新,那么用户刚刚进行了刷新。


谢谢,这个方法可以用,但我不想使用JavaScript - 我正在寻找仅PHP的解决方案。 - user114671

3

不,没有。

PHP提供了$_SERVER变量与HTTP_REFERER变量。不幸的是,网络浏览器只有在位置更改(如单击链接等)时才会更新referer值(它们在请求中发送给Web服务器的)。然而,对于F5刷新,它们不进行更新(因为页面毕竟不是其referer。用户通过按下f5采取了行动)。

但是,您可以使用JavaScript或其他客户端脚本来跟踪按键或页面卸载。然后,您可以使用客户端脚本在客户端上识别刷新,或者更新一些服务器端的用户跟踪。

您还可以仅在服务器端跟踪用户请求的页面。但这不能具体标识F5刷新。标签关闭/打开、重新打开链接等也将导致请求相同的URI。


3

是的,有一种方法可以检测F5浏览器刷新。我已经在Chrome和Firefox中测试了这个解决方案,它有效。

$cacheControlRequestHeader = ', '.strtolower($_SERVER['HTTP_CACHE_CONTROL']).', ';
if (strpos($cacheControlRequestHeader, ', max-age=0, ') !== false){
    $isF5Refresh = true;
}

当我在Internet Explorer 11中测试时,“max-age”无法正常工作。但是您可以使用以下代码在IE中检测Ctrl + F5:

$cacheControlRequestHeader = ', '.strtolower($_SERVER['HTTP_CACHE_CONTROL']).', ';
if (strpos($cacheControlRequestHeader, ', no-cache, ') !== false){
    $isControlF5RefreshIE = true;
}

2

没有绝对可靠的方法来识别客户端或服务器端的F5刷新。但我有一个想法:

每次加载页面时:

  • 将当前URL与会话变量进行比较(见下文)。如果它们相同,则可以假定用户重新加载了页面
  • 将当前URL存储在会话变量中,例如LAST_VIEWED_PAGE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接