我有一个PHP程序连接到网站上的MYSQL数据库。 单击链接以下载文件后,程序将从数据库中读取整数字段,将其递增,然后将数字放回,以计算下载次数。该计划有效。然而,随着时间的推移,下载计数似乎适度膨胀。
在下载文件的链接后,网络漫游器可以增加下载次数吗?如果是这样,会告诉网络机器人忽略网站上的下载页面,使用robots.txt文件,解决膨胀的计数问题?
这是PHP代码:
function updateDownloadCounter($downloadPath, $tableName, $fileNameField, $downloadCountField, $idField)
{
require("v_config.php");
if(isset($_REQUEST["file_id"]) && is_numeric($_REQUEST["file_id"])) {
try
{
$sql = "SELECT * FROM " . $tableName . " WHERE file_id = " . $_REQUEST[$idField];
$connection = new PDO($dsn, $username, $password, $options);
$statement = $connection->prepare($sql);
$statement->execute();
$result = $statement->fetchAll();
if ($result && $statement->rowCount() == 1)
{
foreach ($result as $row)
{
if(is_file($_SERVER['DOCUMENT_ROOT'].$downloadPath . $row[$fileNameField]))
{
$count = $row[$downloadCountField] + 1;
$sql = "UPDATE " . $tableName . " SET " . $downloadCountField . " = " . $count . " WHERE file_id = " . $_REQUEST[$idField];
$statement = $connection->prepare($sql);
$statement->execute();
$documentLocationAndName = $downloadPath . $row[$fileNameField];
header('Location:' . $documentLocationAndName);
}
}
}
}
catch(PDOException $error)
{
echo $sql . "<br>" . $error->getMessage();
}
}
}
答案 0 :(得分:1)
您的两个问题的答案都是是。
当抓取工具为您的网站编制索引时,它还会查找相关内容,类似于创建站点地图。它在页面上查找相关内容的第一个位置是直接链接。如果您直接在下载页面链接到您的文件,则抓取工具也会尝试索引这些链接。
阻止抓取工具看到包含robots.txt
的下载页面会阻止此问题,但随后您将失去潜在的SEO。如果第三方直接链接到您的下载怎么办?如果他们的他们的下载页面已编入索引,则您的链接仍会对抓取工具可见。
幸运的是,您可以禁用此行为。只需将以下内容添加到下载页面的<head>
部分,告诉抓取工具下载页面上的链接都是 canonical 的链接:
<link rel="canonical" href="http://www.example.com/downloads" />
考虑到参数本质上是不同的“网页”,抓取工具会认为/downloads?file_id=1
与/downloads
不同。添加上面的行会告诉他们它是同一页面,并且他们不需要打扰。
假设您有被索引的实际文件(例如PDF),您可以阻止抓取工具在.htaccess
或httpd.conf
中对其进行索引:
<Files ~ "\.pdf$">
Header set X-Robots-Tag "noindex, nofollow"
</Files>
作为后备,您可以随时查看谁在尝试下载PHP本身的文件!这取决于你想要多么迂腐(因为有很多很多的不同抓取工具),但这个功能非常好用:
function bot_detected() {
return (
isset($_SERVER['HTTP_USER_AGENT'])
&& preg_match('/bot|crawl|slurp|spider|mediapartners/i', $_SERVER['HTTP_USER_AGENT'])
);
}
然后在运行try
之前简单地将其称为条件:
if (!bot_detected()) {
try { } // Will only get executed for real visitors
}
另外,我建议您使用$_GET["file_id"]
而不是$_REQUEST["file_id"]
。 $_REQUEST
将$_GET
与$_POST
和$_COOKIE
结合在一起,后者往往以相同的方式使用。虽然这只是technically secure,但如果您只是检索数据,那么将请求限制为简单的$_GET
会更安全。
希望这有帮助! :)