You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AdonisJS v6生产环境跨域前端登出时始终返回302重定向而非JSON响应的问题

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:08:01