如何在nginx中遵循HTTP重定向?


15

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

基本代码如下:

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

    proxy_pass http://$uri/;
}

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

error_page 301 302 307 =200 @redir;

...并具有此命名位置:

location @redir {
    proxy_pass $proxy_location;
}

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

有什么想法吗?

Answers:


7

我相信您想要变量$ upstream_http_location

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

请注意,在从上游服务器收到响应之前,这些$ upstream变量不能为空,因此只能使用null。


26

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

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;
    }
}

1
为什么必须将$ upstream_http_location的值保存在新变量中?
Parth Shah

1
我不知道确切的原因,但否则无法正常工作……
Vlad Frolov

这很好,但仅捕获单个重定向。有什么办法可以处理多个重定向?
ThiefMaster

1
@ThiefMaster我相信这个答案就是您想要的。
iBug

2020/01/23 09:17:46 [error] 1394#0: *1 invalid URL prefix in "", client: xx.xx.28.3, server: www.example.com, request: "GET /test HTTP/1.1", host: "www.example.com"使用@handle_redirect块收到以下错误,知道吗?
西里尔·杜松-多丽丝
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.