我正在使用 Nginx 来缓存一些响应。生成这些响应的后端Cache-control
为所有响应设置一个通用标头。但是,我需要将一些响应缓存得比其他响应更长。也就是说,我需要cache-control
在指令考虑标头之前对其进行修改proxy_pass
。
我正在使用ngx_lua_module
并想使用指令修改位置块Cache-Control
中的标头。预期的配置如下所示:internal
header_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 = /actual
为location / {}
。
我还想说你根本不需要 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;
}
}