在 nginx 上缓存之前替换 JSON 主体

在 nginx 上缓存之前替换 JSON 主体

在缓存并返回给客户端之前,我一直在努力尝试修改来自 Web 服务器的 JSON 响应,但没有结果。

我正在使用 docker、openresty alpine 镜像和 nginx。

我的配置从这样设置的docker文件开始:

FROM openresty/openresty:alpine

COPY ./nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["/usr/local/openresty/bin/openresty", "-g", "daemon off;"]

然后我的nginx.conf文件看起来是这样的:

proxy_cache_path /var/cache levels=1:2 keys_zone=default_zone:10m max_size=10g inactive=10d use_temp_path=off;

server {
  listen 80;

  location / {
    # Proxy settings
    proxy_pass              http://www.some-site.com;
    proxy_cache             default_zone;
    proxy_cache_methods     GET;
    proxy_cache_valid       100d;

    proxy_ignore_headers    Cache-Control;
  }
}

我一直尝试使用 lua 块从服务器获取响应,但没有成功,也尝试使用 cjson lib 来解析它。到目前为止,我遇到的问题如下:

我如何获取的响应主体http://www.some-site.com

另外,假设 JSON 文件如下所示:

{
  "fields": [{
    "someUrl": "http://www.some-other-site.com/resource/some-resource"
  }]
}

如何someUrl通过在数组内部的对象上使用此键来修改所调用的每个键,并且可以包含具有相同键的多个对象?

例如,我试图将域替换为运行我的服务器的同一域。我已将其配置为指向端口 4080,因此我希望此对象在将响应发送到客户端和缓存之前是这样的,因此响应主体如下所示:

{
  "fields": [{
    "someUrl": "http://localhost:4080/resource/some-resource"
  }]
}

我知道我必须使用正则表达式来替换域名,但对于我提到的其他问题,我真的不知道该怎么做。我尝试查看谷歌,搜索具体信息,阅读 nginx 文档,但仍然不知道该怎么做。

非常感谢大家!!

答案1

已经解决问题。

幸运的是,openresty 已经内置了对 的支持ngx_http_sub_module

为了让它工作,我必须这样做:

proxy_cache_path /var/cache levels=1:2 keys_zone=default_zone:10m max_size=10g inactive=10d use_temp_path=off;

server {
  listen 80;

  location / {

    # Have to escape slashes:
    sub_filter "http:\/\/www.some-site.com" "$scheme://$host";

    # Disable sub_filter_once as I can have multiple keys to affect
    sub_filter_once off;

    # Sub filter type to accept application/json (mandatory)
    sub_filter_types        application/json;

    # Disable compressed response, as Content-Encoding the site is gzip
    proxy_set_header        Accept-Encoding "";

    # Proxy settings
    proxy_pass              http://www.some-site.com;
    proxy_cache             default_zone;
    proxy_cache_methods     GET;
    proxy_cache_valid       100d;

    proxy_ignore_headers    Cache-Control;
  }
}

相关内容