配置Tomcat+NGINX auth_request遇301错误,求排查建议
我仔细看了你的问题描述和提供的nginx.conf配置,发现两个核心配置问题,这应该就是导致你遇到301跳转和无法访问/test路径的原因:
1. Auth子请求的代理路径不匹配Tomcat的认证端点
你的location = /auth/配置里,proxy_pass http://0.0.0.0:8080;会把NGINX的/auth/子请求转发到Tomcat的**/auth/路径(注意结尾的斜杠),但你提到手动访问/auth**(无斜杠)才能拿到200响应。大多数Java Web应用(包括Tomcat)对路径的结尾斜杠很敏感,访问/auth/大概率会触发Tomcat返回301重定向到/auth。
而NGINX的auth_request默认不会跟随后端的重定向,直接把301状态码当成认证失败,这就会导致NGINX拒绝用户访问,或者后续跳转逻辑彻底混乱。
修复方案:
调整auth的location配置,确保转发到Tomcat的/auth端点(无斜杠):
location = /auth { internal; proxy_pass http://0.0.0.0:8080/auth; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; }
同时更新/test location里的auth_request指令为不带斜杠的版本:
location /test { root /data/www; autoindex on; auth_request /auth; auth_request_set $auth_status $upstream_status; }
2. /test路径的自动跳转导致认证上下文丢失
当用户访问http://你的服务器地址/test(不带结尾斜杠)时,因为你开了autoindex on,NGINX默认会返回301重定向到http://你的服务器地址/test/(带斜杠)。但这个重定向过程中,如果Tomcat的认证是基于会话Cookie的,浏览器可能不会在重定向请求里正确携带Cookie,或者NGINX在重定向后没重新执行auth_request验证,直接导致访问被拒。
修复方案:
有两种方式解决这个问题:
- 方式一:强制用户访问带斜杠的路径,或者在NGINX里加个显式的重定向规则,自动把/test重定向到/test/,确保重定向后能携带认证信息:
location = /test { return 302 $scheme://$host/test/; } location /test/ { root /data/www; autoindex on; auth_request /auth; auth_request_set $auth_status $upstream_status; }
- 方式二:关闭NGINX的自动目录跳转(不太推荐,不符合用户访问习惯),不过更稳妥的还是用方式一的显式重定向。
额外排查小技巧
如果以上修复后还是有问题,可以试试这些方法进一步定位:
- 去看Tomcat的访问日志,确认NGINX的子请求是不是真的到了正确的/auth端点,以及返回的状态码到底是什么。
- 临时开启NGINX的debug日志(把
error_log /var/log/nginx/error.log;改成error_log /var/log/nginx/error.log debug;),看看auth_request子请求的详细处理流程,能帮你搞清楚子请求有没有成功、有没有拿到预期的状态码。 - 直接访问
http://你的服务器地址/test/(带斜杠),看看能不能正常显示目录列表,先排除跳转带来的问题。
验证修复效果
改完配置后,按下面的步骤验证:
- 重新加载NGINX配置:
sudo nginx -s reload - 访问
http://你的服务器地址/test,确认会自动跳转到/test/,而且认证后能正常显示目录结构。 - 查看NGINX的access.log,确认请求状态码是200,不是301或者4xx之类的错误码。
内容的提问来源于stack exchange,提问作者FwdThinking

