AdonisJS v6生产环境跨域前端登出时始终返回302重定向而非JSON响应的问题
看起来你遇到的问题是AdonisJS在生产环境下没有正确识别你的JSON请求,从而触发了会话认证默认的登出重定向逻辑。我帮你梳理几个可能的原因和对应的解决办法:
检查生产环境中请求头是否正确传递
有时候生产环境的反向代理(比如Nginx、CDN)会意外修改或丢失请求头。你可以先在登出控制器里临时添加日志,确认Accept头是否真的被AdonisJS接收到了:async logout({ auth, response, i18n, request }: HttpContext) { console.log('Received Accept header:', request.headers().accept); // 生产环境查看这个日志 await auth.use('web').logout() return response.ok({ message: i18n.t('auth.logout_success') }) }如果发现
Accept头不是application/json,那需要检查反向代理的配置,确保它没有修改这个头,同时确认前端请求确实正确设置了这个头。修改Web守卫的重定向配置
AdonisJS的Session认证守卫默认配置了登出后的重定向地址,当它认为请求不是AJAX类型时,就会触发这个重定向。你可以在config/auth.ts里找到web守卫的配置,把redirects中的logout项设为null,禁用默认重定向:export default authConfig({ default: 'web', guards: { web: { driver: 'session', provider: { // 你的provider配置... }, redirects: { login: '/login', logout: null, // 把这里改成null home: '/', }, }, }, })这样即使AdonisJS没有识别出JSON请求,也不会自动重定向,而是执行你控制器里的响应逻辑。
强制告诉AdonisJS这是AJAX请求
AdonisJS除了检查Accept头,还会通过X-Requested-With: XMLHttpRequest头来判断是否是AJAX请求。你可以在前端的登出请求中额外添加这个头,比如在Next.js的fetch请求里:await fetch('/api/v1/logout', { method: 'POST', credentials: 'include', headers: { 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' // 加上这个头 } })这样AdonisJS会明确识别这是一个AJAX请求,跳过默认的重定向逻辑。
检查反向代理的协议头传递
如果你的生产环境用了反向代理(比如Nginx),要确保它给AdonisJS传递了正确的X-Forwarded-Proto头,让AdonisJS知道请求是HTTPS的。比如在Nginx配置里添加:proxy_set_header X-Forwarded-Proto $scheme;这会影响AdonisJS对Secure Cookie的处理,也可能间接影响请求类型的判断。
内容来源于stack exchange

