可利用 Nginx sub_filter 模块在反向代理时动态替换 JSON 响应中的图片 URL 域名,但需配置 sub_filter_types application/json、sub_filter_once off,并确保匹配路径精准以避免破坏 JSON 结构。

可以利用 Nginx 的 sub_filter 模块在反向代理时动态替换 JSON 响应体中的图片 URL 域名,但需注意其限制和正确配置方式。
确保 sub_filter 能作用于 JSON 响应
sub_filter 默认只处理 text/html 类型响应,而 JSON 通常是 application/json。必须显式启用对 JSON 的处理:
- 添加
sub_filter_types application/json;,允许对 JSON 响应体执行替换 - 确认后端返回的 Content-Type 确实为
application/json(可用 curl -I 验证) - 若后端未设 Content-Type 或设为
text/plain,可加sub_filter_types text/plain;并配合add_header Content-Type application/json;强制类型(注意:修改 Content-Type 不影响 sub_filter 匹配,仅影响浏览器解析)
编写安全、精准的替换规则
JSON 是结构化文本,直接字符串替换有风险(如误改字段名、嵌套值或非 URL 内容)。建议:
- 用完整路径匹配,避免只替换域名导致误伤:
sub_filter "https://old.example.com/uploads/" "https://cdn.example.com/uploads/"; - 若需替换多个域名,使用多条
sub_filter指令(Nginx 不支持正则替换,且按顺序执行) - 开启
sub_filter_once off;以替换响应中所有匹配项(默认只换第一个) - 避免在 JSON 字符串外(如注释或键名)出现相同文本,否则可能误改;如有风险,建议后端统一规范字段命名(如固定用
"image_url"键)
处理编码与响应完整性
JSON 中可能含转义字符(如 \")、Unicode 或 gzip 压缩,需注意:
-
sub_filter在解压后、编码前工作,因此无需手动解 gzip;但若后端已压缩且 Nginx 未配置gunzip on;,则无法处理压缩响应 —— 推荐后端不压缩 JSON,或在 Nginx 启用gunzip on; - 替换内容必须保持 JSON 语法合法:确保引号、斜杠、转义一致,例如将
http:\/\/old.com\/a.jpg替换为https:\/\/cdn.com\/a.jpg时,注意反斜杠数量 - 替换后响应体长度变化不影响 JSON 解析,但需确保不破坏原有结构(如不能删掉引号或逗号)
完整配置示例
以下是一个典型代理配置片段:
location /api/ {
proxy_pass https://backend;
proxy_set_header Host $host;
<pre class='brush:php;toolbar:false;'># 启用 JSON 替换
sub_filter_types application/json;
sub_filter_once off;
# 替换图片域名(按需添加多行)
sub_filter "https://images.old.com/" "https://cdn.example.com/";
sub_filter "http://images.old.com/" "https://cdn.example.com/";
# 可选:强制 JSON 类型头(如果后端未正确设置)
proxy_hide_header Content-Type;
add_header Content-Type application/json;
# 若后端可能返回 gzip,启用解压
gunzip on;}


















