在 nginx 中将上游响应从 302 更改为 301

在 nginx 中将上游响应从 302 更改为 301

我有一个 Django 应用程序作为上游,在 nginx 中使用 Gunicorn,该应用程序有时会向我发送带有位置的 302。这完全没问题。

我们无法触及 Django 的代码,但同事需要将 302 改为 301。

所以我想将 302 修改为 301,但我还没有找到不使用 LUA 的方法。我尝试过“error_page”语句的组合,例如error_page 302 =301 @redirect;与“proxy_intercept_errors on;”、命名位置等,但没有任何成功。

有没有什么快捷的方法可以实现它?谢谢。

编辑1:下面是我非常简单的上游:

upstream test {
  server unix:/webapps/test/gunicorn.sock fail_timeout=0;
}

答案1

您可以按照建议使用proxy_intercept_errors和更改 3xx 状态代码。error_page

您将需要使用该值来$upstream_http_location重建Location替换响应中的标题。

以其最简单的形式,您可以使用:

proxy_intercept_errors on;
error_page 302 = @redirect;
location @redirect {
    return 301 $upstream_http_location;
}

在这种情况下,是上游服务器响应中标头$upstream_http_location的原始值,在经过转换之前- 相当于使用。Locationproxy_redirectproxy_redirect off;

这可能足以满足您的需要。


但是,如果您需要重写Location响应标头(例如,如果您正在使用proxy_redirect default;),则可能需要使用 来修改响应map

例如:

map $upstream_http_location $location {
        ~^https?://[^/]+(.*)$    $1;
        default                  /oops;
}

server {
    ...
    proxy_intercept_errors on;
    error_page 302 = @redirect;
    location @redirect {
        return 301 $location;
    }
}

相关内容