如何统计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中转脚本:
- 先把所有PDF文件放到Web根目录以外的安全路径(比如
/path/to/your/pdfs/),避免直接访问。 - 编写
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文件不存在'; } ?>
- 把网站里的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
相关产品推荐
相关产品推荐

