nginx proxy_pass如何处理HTTP 303 See Other内部重定向问题
Nginx内部处理303重定向配置方案
核心思路
通过拦截后端返回的303响应,在Nginx服务内部完成重定向地址的请求,再将最终结果返回给客户端,全程不需要客户端感知内部节点地址。
完整配置示例
events {} http { server { listen 80; server_name ceph-dashboard; location / { proxy_pass https://node1.foo.com:8443; proxy_ssl_verify off; # 开启拦截后端响应,不直接将300+状态码返回给客户端 proxy_intercept_errors on; # 捕获303状态码,交给内部location处理 error_page 303 = @handle_redirect; } location @handle_redirect { # 303规范要求使用GET方法请求重定向地址,丢弃原请求体 proxy_method GET; # 直接使用后端返回的Location头作为代理目标 proxy_pass $upstream_http_location; proxy_ssl_verify off; # 如需支持多次303重定向,可开启以下两条配置 # proxy_intercept_errors on; # error_page 303 = @handle_redirect; # 可根据需要开启重定向次数限制,避免死循环 # set $redirect_count 0; # if ($redirect_count > 2) { # return 502 "Too many redirects"; # } # set $redirect_count $redirect_count+1; } } }
配置说明
proxy_intercept_errors on:开启后后端返回的状态码大于等于300时,不会直接透传给客户端,会匹配Nginx本地的error_page规则。error_page 303 = @handle_redirect:将303状态码的响应交由名为@handle_redirect的内部location处理,=标识最终返回给客户端的状态码以内部请求的结果为准。$upstream_http_location:Nginx内置变量,保存上一次上游服务返回的Location响应头的值,也就是重定向的目标地址。proxy_method GET:符合HTTP 303响应的规范要求,无论原请求是POST/PUT等哪种方法,重定向请求统一使用GET方法发起。
内容的提问来源于stack exchange,提问作者Ralph
相关产品推荐
相关产品推荐

