Nginx可通过rewrite+proxy_pass、map+proxy_pass或subrequest实现原始图片路径到缩略图服务的透明映射:提取查询参数重写为缩略图服务可识别格式后转发,支持自动降级与鉴权扩展,需注意斜杠处理、参数透传及缓存配置。
在 Nginx 中实现“将原始大图路径实时映射为缩略图服务请求”,核心是利用 rewrite 或 subrequest 思路,把对 /images/xxx.jpg 这类原始路径的请求,不重定向、不跳转,而是内部转发(proxy_pass)到缩略图服务(如 Thumbor、imgproxy 或自建服务),同时动态提取尺寸、格式等参数。
假设原始图路径为:/uploads/photo-123456789.jpg,你想访问 /thumb/300x200/uploads/photo-123456789.jpg 来获取缩略图。但更常用的是「透明映射」:直接请求原图路径,Nginx 自动识别并转给缩略图服务处理。
推荐做法是:约定 URL 中带查询参数(如 ?width=300&height=200&fit=cover),Nginx 拦截带这些参数的图片请求,重写为缩略图服务可识别的格式(如 path-based 或 query-based),再 proxy_pass。
.(jpg|jpeg|png|webp)$)且含缩略图参数rewrite 提取原始路径和参数,构造缩略图服务目标 URLproxy_pass 转发,注意结尾斜杠与路径拼接逻辑示例配置:
location ~* ^/uploads/.+.(jpg|jpeg|png|webp)$ {# 只对带缩略图参数的请求生效if ($args ~* "(^|&)width=d+(&|$)") {set $thumb_width $arg_width;set $thumb_height $arg_height;set $thumb_fit $arg_fit;# 重写为 thumbor 风格路径:/unsafe/{width}x{height}/source_pathrewrite ^(.*)$ /unsafe/${thumb_width}x${thumb_height}/${thumb_fit}/$1 break;proxy_pass http://thumbor-server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;break;}}
如果希望「默认返回缩略图,仅加 ?raw 才返回原图」,可用 map 指令预定义 upstream 目标。
thumbor 或 origin)proxy_pass 目标,避免重复 rewrite?raw 或 Accept: image/* 头)示例:
map $args $backend {default "http://thumbor-server";"~*raw" "http://origin-storage";}server { location ~* ^/uploads/.+.(jpg|jpeg|png|webp)$ { proxy_pass $backend; proxy_set_header Host $host; } }
当缩略图服务需要鉴权、水印策略或动态规则(比如根据 User-Agent 返回不同尺寸),纯 rewrite 不够用。这时可结合 auth_request 或 ngx_http_subrequest_module 做前置决策。
X-Thumb-URL)重写 $request_uri 后 proxy_passOpenResty 用户可直接用 ngx.exec 或 ngx.redirect(内部重定向)完成更灵活的路径生成。
这类映射容易出错,关键细节要盯紧:
proxy_pass http://s;(无斜杠)会把完整 URI 传过去;写成 proxy_pass http://s/;(有斜杠)会替换掉匹配的 location 前缀$args,查询参数会丢,需加 ?$args 或用 proxy_set_header 透传Cache-Control 应被尊重,Nginx 可配 proxy_cache 减轻后端压力image/webp 等现代格式被正确识别,必要时加 types { image/webp webp; }