如何用另一个值替换 NGINX 响应标头中*每个*出现的字符串?

Men*_*hak 5 reverse-proxy nginx http-headers

我有一个 Nginx 设置,正在使用proxy_pass它与内部服务器通信并返回响应。我想要做什么 - 我可以用另一个单词替换特定标头中特定字符串的每个实例吗?

指向proxy_pass内部服务器,并在响应中发送以下标头:

WWW-Authenticate: Bearer realm="https://someinternal.domain/v2/token",service="https://someinternal.domain/v2/token"
Run Code Online (Sandbox Code Playgroud)

我希望覆盖它,将“someinternal”字符串替换为“mypublic”

WWW-Authenticate: Bearer realm="https://mypublic.domain/v2/token",service="https://mypublic.domain/v2/token"
Run Code Online (Sandbox Code Playgroud)

我知道 nginx 的sub_filter,但这似乎只适用于响应正文,而不适用于标头。
我知道proxy_redirect,但这仅适用于 Location 标头。
所以这个问题归结为 - 如何在自定义标头中执行这些 URL 替换?


我确实有一些工作,但感觉不优雅;如果我可以在不知道标头结构的情况下替换所有出现的情况,那就太好了。

map $upstream_http_www_authenticate $newvalue {
  ~(.*)(someinternal)(.*)(someinternal)(.*)  $1mypublic$3mypublic$5;
  default "";
}

server {
    listen 80;

    location / {
      proxy_pass https://someinternal.domain/;
      proxy_hide_header 'WWW-Authenticate';
      add_header WWW-Authenticate $newvalue always;
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用 Nginxmap和正则表达式来查找“someinternal”,然后在正则表达式匹配之间使用“mypublic”重建标头。然后我用来proxy_hide_header隐藏内部标头,并添加其替换项。