如何配置Htaccess使GIF图片请求触发PHP访问计数器脚本执行
解决方案
1. 修复.htaccess 500错误及规则逻辑
你触发500错误的核心原因有两个:
RewriteRule ^output.gif$ output.php[R=301,L]中output.php和规则标识[R=301,L]之间缺少空格,语法错误直接触发服务端报错- 重复声明
RewriteEngine On属于冗余配置,虽然不直接报错但不必要
另外你用R=301永久重定向的逻辑是错的:301会被浏览器长期缓存,后续用户请求output.gif时不会再请求你的服务端,直接用本地缓存的重定向结果,计数会完全失准。你需要的是内部重写(用户侧看不到跳转到php的过程,直接返回图片内容),不要用重定向标识。
修正后的.htaccess规则如下:
RewriteEngine On Options +FollowSymlinks RewriteBase / # 内部重写:所有请求output.gif的流量静默交给output.php处理,不触发跳转 RewriteRule ^output.gif$ output.php [L]
2. 修正PHP脚本逻辑
你现有脚本的问题是:会把生成的gif写入本地文件,还输出了<img>标签,跨域嵌入时返回的是HTML内容而非图片资源,会显示裂图。需要改为直接输出图片二进制流,设置正确的响应头,不需要写本地文件,也不需要输出HTML内容。
修正后的output.php代码如下:
<?php // 1. 计数逻辑 $file = 'visitas.txt'; // 兼容文件不存在的场景 if (!file_exists($file)) { file_put_contents($file, '0'); } $views = intval(trim(file_get_contents($file))); $fdata = $views + 1; file_put_contents($file, $fdata); // 2. 生成数字对应图片 $sources = str_split((string)$fdata); array_walk($sources, function(&$item) { $item .= '.png'; // 兼容数字图片不存在的场景,避免报错 if (!file_exists($item)) { $item = '0.png'; } }); $stack = new Imagick(); foreach ($sources as $source) { $stack->addImage(new Imagick($source)); } $montage = $stack->montageImage(new ImagickDraw(), '10x1', '40x33', 0, '0'); // 3. 输出图片响应头,直接返回gif二进制流 // 允许跨域加载,避免其他域名嵌入时被拦截 header('Access-Control-Allow-Origin: *'); // 设置返回内容类型为gif图片 header('Content-Type: image/gif'); // 禁止浏览器缓存图片,确保每次加载都请求服务端更新计数 header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); header('Pragma: no-cache'); // 直接输出图片内容,不需要写入本地文件,也不需要输出img标签 echo $montage->getImagesBlob(); exit; ?>
3. 额外注意事项
- 确保
visitas.txt文件所在目录有读写权限,Linux环境可执行chmod 666 visitas.txt设置权限 - 确保你用到的0-9的数字png图片都放在脚本同级目录,命名为
0.png到9.png - 其他站点嵌入时直接用
<img src="https://你的域名/output.gif" />即可,每次加载都会触发计数逻辑
内容的提问来源于stack exchange,提问作者Sophie
相关产品推荐
相关产品推荐

