PHP刷新
如果页面刷新,然后你会期望以下互相为相同的URL(路径,文件名,查询字符串),和相同形式的内容(如果有的话)(POST数据)两个请求。这可能是相当多的数据,所以最好对它进行散列。所以......
<?php
session_start();
//The second parameter on print_r returns the result to a variable rather than displaying it
$RequestSignature = md5($_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING'].print_r($_POST, true));
if ($_SESSION['LastRequest'] == $RequestSignature)
{
echo 'This is a refresh.';
}
else
{
echo 'This is a new request.';
$_SESSION['LastRequest'] = $RequestSignature;
}
在你必须要小心的AJAX情况有关哪些文件你把这个代码放入,以免更新这是异步调用脚本LastRequest签名。
@naveen如果用户在您的网站上打开了多个选项卡,在第一个选项卡上提交表单,在另一个选项卡上提交其他选项卡,关闭该选项卡,然后在第一个选项卡上刷新?上次请求可能并不总是有效。 – dqhendricks 2012-01-23 17:19:10
如果你的意思是你要当用户第一次从当他们重新加载页面检查引用来的页面之间进行区分。在PHP中它是:$ _SERVER [“HTTP_REFERER”]。看看它是否与您的脚本运行的页面相同。可能是客户端不提供此信息,如果发生这种情况,您可以设置cookie或会话变量来跟踪上次请求的页面。
<?php
session_start();
if (!isset($_SESSION["visits"]))
$_SESSION["visits"] = 0;
$_SESSION["visits"] = $_SESSION["visits"] + 1;
if ($_SESSION["visits"] > 1)
{
echo "You hit the refresh button!";
}
else
{
echo "This is my site";
}
// To clear out the visits session var:
// unset($_SESSION["visits"]);
?>
这当然不能保证他们点击刷新按钮。他们可能已通过(例如)您的网站的内部链接回到此页面。 – Wickethewok 2009-01-19 17:37:56
反对。这只会检测到对该网站的多次访问。每次重载或导航到具有此脚本的另一个URL时,都会增加计数器。这对检测页面重新加载没有用处。 – six8 2012-08-28 05:42:03
如果有人刷新页面,将发送与上一页相同的请求。所以你应该检查当前请求是否与最后一个请求相同。
session_start();
$pageRefreshed = false;
if (isset($_SESSION['LAST_REQUEST']) && $_SERVER['REQUEST_URI'] === $_SESSION['LAST_REQUEST']['REQUEST_URI']) {
if (isset($_SERVER['HTTP_REFERER'])) {
// check if the last request’s referrer is the same as the current
$pageRefreshed = $_SERVER['HTTP_REFERER'] === $_SESSION['LAST_REQUEST']['HTTP_REFERER'];
} else {
// check if the last request didn’t have a referrer either
$pageRefreshed = $_SERVER['HTTP_REFERER'] === null;
}
}
// set current request as "last request"
$_SERVER['LAST_REQUEST'] = array(
'REQUEST_URI' => $_SERVER['REQUEST_URI'],
'HTTP_REFERER' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null
);
我没有测试它,但它应该工作:这可以如下完成。
很好,谢谢! – 2014-01-16 22:21:37
为了防止用户点击浏览器刷新或返回按钮时出现重复表单处理,您需要使用页面实例id会话变量以及包含该变量的隐藏表单输入。当两者不匹配时,则用户已刷新页面,并且不应该重新处理表单。对于进一步的细节,请参见:
当用户点击刷新按钮时,浏览器包括其中出现$ _SERVER阵列中一个额外的标头。
测试使用下面的刷新按钮:
$refreshButtonPressed = isset($_SERVER['HTTP_CACHE_CONTROL']) &&
$_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0';
如果你想防止副作用(一般的POST请求),该请求可以被发送多次,你应该说这在你的问题。因为这将采用与迄今为止使用的答案不同的方法。 – Gumbo 2009-01-19 15:34:46
赞同Gumbo。如果实际上你的目标是避免POST请求的副作用,那么你应该使用GET重定向到一个新页面。 – Wickethewok 2009-01-19 17:40:10