🖼️ 图片代理与缓存系统

这是一个用于代理和缓存远程图片的系统,主要功能包括:

  1. 🔄 图片代理通过URL参数获取远程图片并返回
  2. 💾 图片缓存:自动缓存已访问的图片,提高访问速度
  3. 🔒 防盗链支持支持设置Referer解决部分网站的防盗链问题

📝 项目说明:本项目是基于 img.php 的二次开发版本,增加了更多功能和安全性改进。

🚀 使用方法

在浏览器中访问:

/index.php?url=https://example.com/image.jpg

使用伪静态后的访问方式:

/image/https://example.com/image.jpg

⚙️ 伪静态配置

Apache 配置

在网站根目录创建或编辑 .htaccess 文件:

RewriteEngine On
RewriteBase /

# 图片代理伪静态规则
RewriteRule ^image/(.*)$ index.php?url=$1 [L,QSA]

# 禁止直接访问 index.php
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php [NC]
RewriteRule ^ - [F]

Nginx 配置

在网站配置文件中添加:

location / {
    # 图片代理伪静态规则
    rewrite ^/image/(.*)$ /index.php?url=$1 last;
    
    # 禁止直接访问 index.php
    location = /index.php {
        return 403;
    }
}

📋 参数说明

  • url: 必填参数需要代理的远程图片URL

💡 技术特点

  • 🖼️ 支持多种图片格式GIF、JPEG、PNG、WebP、BMP、SVG
  • 📁 自动创建缓存目录结构
  • 🔐 支持HTTPS图片获取
  • 🔄 自动处理重定向
  • ⏱️ 合理的超时设置
  • 📝 完善的错误处理和日志记录
  • 图片数据验证
  • 缓存过期控制

🛡️ 安全特性

  • 🔍 输入验证确保URL以http或https开头
  • 📝 文件类型验证:只允许特定图片格式
  • 🔒 目录权限控制:缓存目录权限设置
  • 🔐 SSL验证支持HTTPS图片获取
  • 图片数据验证:验证下载的图片数据是否有效
  • 📝 错误处理:完善的错误处理和日志记录
  • 🚫 域名白名单:支持配置允许访问的域名列表,防止服务被滥用

性能优化

  • 💾 图片缓存机制24小时缓存
  • ⏱️ 合理的超时设置
  • 💪 内存使用优化
  • 🔄 并发处理能力
  • 🌐 缓存控制头:支持浏览器缓存

📁 文件说明

  • index.php: 入口文件,处理请求
  • ImageProxy.php: 核心类文件,实现图片代理和缓存功能
  • img.php: 原始项目文件,本项目基于此进行二次开发
  • cache/: 缓存目录
  • cache/logs/: 日志目录

⚙️ 配置说明

可以通过修改index.php中的配置参数来调整系统行为:

$proxy = new ImageProxy([
    'cache_dir' => 'cache',      // 缓存目录
    'timeout' => 30,             // 请求超时时间(秒)
    'connect_timeout' => 15,     // 连接超时时间(秒)
    'max_redirects' => 5,        // 最大重定向次数
    'allowed_domains' => [       // 允许访问的域名白名单
        'example.com',
        'trusted-site.com',
        'images.example.org'
        // 添加更多允许的域名
    ]
]);

白名单配置说明:

  • 如果 allowed_domains 为空数组,则允许访问所有域名
  • 支持精确域名匹配(如 example.com
  • 支持子域名匹配(如 images.example.com 会匹配 example.com
  • 域名比较不区分大小写
  • 不在白名单中的域名请求将被拒绝,并记录到日志中

📝 错误处理

系统会自动记录所有错误到日志文件中,日志文件位于cache/logs/目录下,按日期命名。系统实现了自动日志轮转功能:

  • 📊 单个日志文件大小限制10MB
  • 日志文件保留时间30天
  • 📚 最大保留日志文件数10个
  • 🧹 自动清理过期日志
  • 🔄 自动轮转超大日志文件

日志文件命名规则:

  • 当前日志:YYYY-MM-DD.log
  • 轮转后的日志:YYYY-MM-DD.log.YYYY-MM-DD_HH-mm-ss

⚠️ 注意事项

  1. 💾 确保服务器有足够的磁盘空间用于缓存
  2. 🔒 确保缓存目录有写入权限
  3. 🧹 建议定期清理缓存文件
  4. 📝 日志系统会自动管理日志文件大小和数量,无需手动干预

📄 许可证

本项目采用 MIT License with Attribution Requirement 许可证。详情请查看 LICENSE 文件。

主要条款:

  • 允许非商业用途自由使用
  • 🔒 商业用途需要获得授权
  • 📝 使用时必须注明原作者
  • 🔗 商业使用时必须包含原仓库链接

📧 联系方式

如需商业使用授权,请联系仓库所有者。

Description
这是一个用于代理和缓存远程图片的系统,推荐自己部署在大带宽的服务器上。
Readme 49 KiB
Languages
PHP 100%