Php 防止下载管理器重新发送POST数据

Php 防止下载管理器重新发送POST数据,php,Php,我有以下代码: <?php if($_SERVER['REQUEST_METHOD'] == 'POST') { $filename = date('Y.m.d-H.i.s').'.dat'; file_put_contents($filename, $filename); header('Content-Description: The output file.'); header('Content-type: application/dat');

我有以下代码:

<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $filename = date('Y.m.d-H.i.s').'.dat';
    file_put_contents($filename, $filename);
    header('Content-Description: The output file.');
    header('Content-type: application/dat');
    header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
    header('Content-Transfer-Encoding: binary');
    readfile($filename);
}
?>
<html><body>
    <form method="post"><input type="submit"></form>
</body></html>

代码很好,但是当我的下载管理器IDM捕获下载时,文件会生成两次,有时会生成三次,而用户只单击了一次提交按钮,这是不可取的!我认为,这可能是因为IDM重新发送了POST数据;但是如何检测和防止这种情况呢?

您可以插入一个带有令牌的隐藏输入字段,并进行检查。如果该文件不存在,则下载管理器尝试获取该文件,而不是用户。只是一个想法

另一件事是检查用户代理并将其用作令牌。我猜您的下载管理器没有相同的用户代理。但这将是Javascript,因为单击会删除标记。不要尝试检查所有可能的用户代理,过滤掉下载管理器


或者,您可以检查来自用户同一IP的请求是否在短时间内(例如,1秒)发出。然后,对以下请求不提供任何内容。可能在5秒钟后释放检查…

感谢您的回复,提供的代码只是一个简单的示例,用于传达想法,同一个非机器人用户可以请求另一个文件,而不受任何限制,包括上述时间或IP限制。我不想从下载管理器中筛选出文件,我只是不想为单个请求重新生成相同的文件: