![在 nginx 上缓存之前替换 JSON 主体](https://linux22.com/image/757386/%E5%9C%A8%20nginx%20%E4%B8%8A%E7%BC%93%E5%AD%98%E4%B9%8B%E5%89%8D%E6%9B%BF%E6%8D%A2%20JSON%20%E4%B8%BB%E4%BD%93.png)
在缓存并返回给客户端之前,我一直在努力尝试修改来自 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;
}
}