我有一个 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
的原始值,在经过转换之前- 相当于使用。Location
proxy_redirect
proxy_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;
}
}