如何在 nginx 中跟踪 HTTP 重定向?

Ale*_*off 19 nginx

我有一个基于 nginx 的 HTTP 代理,我想在其中处理所有 HTTP 重定向,以便客户端仅获得重定向链中的最后一个响应。

基本代码如下所示:

location /proxy {
    rewrite ^/proxy/([^/]+) $1 break;

    proxy_pass http://$uri/;
}
Run Code Online (Sandbox Code Playgroud)

我对以下 1 级重定向的尝试是这样的:

error_page 301 302 307 =200 @redir;
Run Code Online (Sandbox Code Playgroud)

...并拥有这个命名位置:

location @redir {
    proxy_pass $proxy_location;
}
Run Code Online (Sandbox Code Playgroud)

只有没有 $proxy_location 变量,我找不到创建它的方法。它应该包含Location:从上游接收到的标头值。

有什么想法吗?

小智 33

这是对我有用的完整示例:

server {
    ...

    location / {
        proxy_pass http://backend;
        # You may need to uncomment the following line if your redirects are relative, e.g. /foo/bar
        #proxy_redirect / /;
        proxy_intercept_errors on;
        error_page 301 302 307 = @handle_redirect;
    }

    location @handle_redirect {
        set $saved_redirect_location '$upstream_http_location';
        proxy_pass $saved_redirect_location;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么必须将 $upstream_http_location 的值保存在新变量中? (2认同)

rma*_*ter 10

我相信你想要变量$upstream_http_location

以 $proxy* 开头的变量控制从 nginx 到上游的内容。$upstream* 系列变量包含有关 nginx 本身收到的响应的信息。您可以使用 $upstream_http_headername 获取从上游服务器收到的任意 HTTP 标头。

请注意,在从上游服务器收到响应之前,这些 $upstream 变量只能为 null,因此它们的使用存在一些限制。

  • 根据堆栈溢出的规则,您不应提供链接,这些链接将来可能会发生变化。相反,您应该提供精确的工作示例。我不知道为什么选择了这个不完整的答案,但它对 stackoveflow 标准没有帮助。弗拉德的回答更有帮助。 (2认同)