You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计Apache+PHP环境下网站中被访问的静态页面(主要为PDF文件)?

嘿,这个需求我太熟了!在Apache+PHP环境下追踪PDF文件的访问记录,其实有好几种靠谱的办法,我给你拆解一下:

方法一:直接扒Apache默认访问日志

Apache默认就会记录所有访问请求,这是最省事的办法。首先找到你的日志文件位置:

  • Debian/Ubuntu系统一般在 /var/log/apache2/access.log
  • CentOS/RHEL系统通常在 /var/log/httpd/access_log

直接用grep筛选出PDF相关的记录:

grep "\.pdf$" /var/log/apache2/access.log

如果想统计每个PDF的访问次数,用这条命令就行,会按访问量从高到低排序:

grep "\.pdf$" /var/log/apache2/access.log | awk '{print $7}' | sort | uniq -c | sort -nr

简单解释下:awk '{print $7}'提取请求的PDF路径,uniq -c统计重复次数,sort -nr倒序排列结果。

方法二:给PDF单独开个专属日志(长期追踪更方便)

如果默认日志太杂,每次筛选麻烦,可以让Apache把PDF的访问请求单独写到一个日志文件里。修改Apache配置文件(比如apache2.conf、httpd.conf或者站点的虚拟主机配置),添加以下内容:

# 定义日志格式,包含IP、访问时间、请求URL、来源页、用户代理等信息
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" pdfcombined
# 指定PDF日志文件路径
CustomLog /var/log/apache2/pdf_access.log pdfcombined env=req_pdf
# 匹配所有PDF请求,标记为req_pdf
SetEnvIf Request_URI "\.pdf$" req_pdf

修改完记得重启Apache生效:

# Debian/Ubuntu
systemctl restart apache2
# CentOS/RHEL
service httpd restart

之后所有PDF的访问都会单独存在pdf_access.log里,分析起来清爽多了。

方法三:用PHP脚本做中转,自定义记录细节

如果你的网站有用户系统,想追踪哪个用户访问了哪个PDF,或者需要更灵活的记录规则,就可以写个PHP中转脚本:

  1. 先把所有PDF文件放到Web根目录以外的安全路径(比如/path/to/your/pdfs/),避免直接访问。
  2. 编写download_pdf.php脚本:
<?php
// 先做安全校验,防止恶意路径遍历
$pdfName = basename($_GET['file']);
$pdfPath = '/path/to/your/pdfs/' . $pdfName;

// 验证文件存在且是PDF
if (file_exists($pdfPath) && pathinfo($pdfPath, PATHINFO_EXTENSION) === 'pdf') {
    // 记录访问信息:IP、用户名(如果登录)、PDF名称、时间
    $logContent = sprintf(
        "%s - %s 访问了 %s | 时间:%s\n",
        $_SERVER['REMOTE_ADDR'],
        isset($_SESSION['username']) ? $_SESSION['username'] : '匿名用户',
        $pdfName,
        date('Y-m-d H:i:s')
    );
    // 追加到自定义日志文件,也可以改成写入数据库
    file_put_contents('/var/log/apache2/pdf_user_access.log', $logContent, FILE_APPEND);

    // 输出PDF给用户
    header('Content-Type: application/pdf');
    header('Content-Disposition: inline; filename="' . $pdfName . '"');
    header('Content-Length: ' . filesize($pdfPath));
    readfile($pdfPath);
    exit;
} else {
    // 找不到PDF返回404
    http_response_code(404);
    echo '抱歉,该PDF文件不存在';
}
?>
  1. 把网站里的PDF链接改成指向这个脚本,比如:
<a href="download_pdf.php?file=年度报告.pdf">查看年度报告</a>

这样每次用户访问PDF都会被记录,还能关联用户身份,适合需要精细化统计的场景。

方法四:用日志工具生成可视化报表(懒人必备)

如果不想自己写命令或者脚本,可以用日志分析工具生成直观的报表,比如goaccess或者awstats:

  • 安装goaccess后,直接运行命令生成HTML报表:
goaccess /var/log/apache2/access.log -o pdf_access_report.html

打开生成的pdf_access_report.html,就能看到PDF的访问量排名、访问来源、高峰时段等可视化数据,非常直观。

这些方法各有侧重,临时查日志用方法一,长期追踪用方法二,要用户关联用方法三,想看可视化报表用方法四,按需选就行~

内容的提问来源于stack exchange,提问作者YodaCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:17:47