核心思路是将缩放尺寸和水印开关嵌入URL路径,由Nginx按规则转发,后端脚本动态处理图片;路径格式为/resize/{尺寸}/{水印策略}/{文件名},支持等比缩放、裁剪、右下角水印、缓存及扩展参数。

核心思路是把“缩放尺寸”和“水印开关”作为 URL 路径的一部分,由 Web 服务器(如 Nginx)按规则转发或响应,后端脚本再据此动态处理图片——不预生成、不硬编码,真正按需执行。
路径设计要清晰可解析
推荐采用统一格式,例如:
/resize/200x150/watermark/photo.jpg
/resize/800x600/noprint/logo.png
-
第一段(如
resize)固定为入口标识,便于 location 匹配 -
第二段(如
200x150)提取宽高,用于缩放计算;支持auto或400单值表示等比缩放 -
第三段(如
watermark或noprint)作为水印策略标识,可映射为是否启用、水印类型(文字/图片)、透明度等参数 -
最后一段是原始文件名,结合配置路径拼出真实源图位置(如
/data/original/photo.jpg)
Nginx 配合 try_files 实现零延迟路由
用 try_files 按优先级检查:先找已缓存的处理结果 → 再交由 PHP/Python 脚本生成 → 最后回源或报错。例如:
location ^~ /resize/ {
# 解析路径:$1=尺寸,$2=水印标识,$3=文件名
rewrite ^/resize/([^/]+)/([^/]+)/(.+)$ /watermark.php?size=$1&mode=$2&path=$3 last;
}
在 watermark.php 中,通过 $_GET['size'] 和 $_GET['mode'] 获取指令,再调用 GD/Imagick 完成缩放+水印合成,并输出带缓存头的图片流。
后端处理的关键控制点
一个健壮的处理脚本需兼顾安全与性能:
- 对
$_GET['path']做白名单校验(只允许.jpg、.png、.webp),并过滤路径遍历(如../) - 缩放时区分「强制拉伸」与「等比裁剪」:前者用
imagecopyresampled拉到指定像素;后者先居中裁切再缩放,避免变形 - 水印叠加位置建议设为右下角 10px 边距,透明度 70%,字体大小随图宽自适应(如
max(12, $width/50)) - 生成后保存至固定结构缓存目录(如
/data/cache/200x150_watermark/photo.jpg),下次直接命中,避免重复计算
扩展性提示
后续如需支持更多能力,只需扩展路径段或 query 参数即可:
- 加质量参数:
/resize/800x600/watermark/q85/photo.jpg→ 控制 JPEG 压缩率 - 选水印图:
/resize/800x600/logo:company.png/photo.jpg→ 提取 logo 名称动态加载 - 适配设备:
/resize/auto@2x/watermark/photo.jpg→ 自动识别 Retina 屏并输出 2 倍图

















