Nginx - proxy_pass 到另一个内部位置块

Nginx - proxy_pass 到另一个内部位置块

我正在使用 Nginx 来缓存一些响应。生成这些响应的后端Cache-control为所有响应设置一个通用标头。但是,我需要将一些响应缓存得比其他响应更长。也就是说,我需要cache-control在指令考虑标头之前对其进行修改proxy_pass

我正在使用ngx_lua_module并想使用指令修改位置块Cache-Control中的标头。预期的配置如下所示:internalheader_filter_by_lua_block

location / {
    proxy_pass /actual;
    proxy_cache something;
}

location = /actual {
    internal;
    proxy_pass https://backend;
    proxy_cache off;
    header_filter_by_lua_block {
        -- modify cache-control header based on request/response parameters
    }
}

但是我找不到通过 实现内部重定向的方法proxy_pass。如果您能提供任何见解,我将不胜感激。

答案1

您无法 proxy_pass转到某个位置,只能proxy_pass转到上游或 URL(基本上是未声明的上游)。因此,正式回答您的问题,您proxy_pass应该本地主机将 Host 标头设置为当前server_name;但这可能会使事情变得过于复杂。

反而- 看起来您需要做的就是摆脱location / {}不需要的然后重命名location = /actuallocation / {}

我还想说你根本不需要 lua - 只需删除从代理网络获取的标题proxy_hide_header并添加你自己的标题add_header

答案2

一般来说,要将控制权传递给另一个位置块,您应该使用内部重定向(改写), 不是proxy_pass

location / {
    rewrite ^.*$ /actual;
}

要修改上游标头,您可以使用proxy_set_header

location /actual {
    proxy_set_header Cache-Control '<your value>';
}

要修改下游标头,您可以使用更多设置标题。它需要使用附加模块自定义 Nginx 构建,但它对于您的情况来说确实非常强大:

location /actual {
    more_set_headers 'Cache-Control: <your value>';
}

考虑到问题的标题,您还可以做一些核心的事情,例如切换服务器来处理客户端流量。我不会建议将它用于这种琐碎的任务,但在极少数情况下它可以提供帮助:

http {

    upstream internal_http_routing {
        server         unix:var/internal.sock;
    }

    server {
        # Internal interface
        listen         unix:var/internal.sock;

        location / {
            return     200;
        }
    }

    server {
        # Client-facing interface
        listen         443 ssl;

        location / {
            proxy_pass http://internal_http_routing;
        }
    }

}

tcp {

    upstream internal_tcp_routing {
        server         unix:var/internal.sock;
    }

    server {
        # Client-facing interface
        listen         8443 ssl;
        proxy_pass     internal_tcp_routing;
    }

}

相关内容