配置自定义basePath后Next Auth凭证登录出现api/auth/session 404错误求助
看起来你遇到的问题核心是Next Auth没有正确适配你设置的basePath,尤其是在非Vercel的cPanel环境下,需要额外调整配置和服务器规则。下面是一步步的解决方案:
1. 修正NEXTAUTH_URL环境变量配置
你当前的NEXTAUTH_URL设置成了https://example.com/twenty-test/api/auth,这是错误的。Next Auth会自动在NEXTAUTH_URL后拼接/api/auth路径,所以正确的配置应该只包含basePath的根路径:
NEXTAUTH_URL="https://example.com/twenty-test"
如果保留原配置,Next Auth会生成重复的路径(/twenty-test/api/auth/api/auth),这直接导致了404错误。
2. 显式配置Next Auth的basePath
在你的[...nextauth].js配置文件中,虽然Next Auth理论上会自动读取basePath,但显式指定basePath参数可以强制适配,避免路径解析异常:
import NextAuth from "next-auth" import CredentialsProvider from "next-auth/providers/credentials" export default NextAuth({ providers: [ CredentialProvider({ // 你的现有配置... name: 'Credentials', type: 'credentials', async authorize(credentials) { return { id: 2, name: 'John Doe', email: 'john@gmail.com', permition: { group: 2, level: 0 } } } }) ], // 显式指定basePath basePath: "/twenty-test/api/auth", // 建议保留jwt策略,适配无数据库场景 session: { strategy: "jwt" } })
3. 调整cPanel的.htaccess配置(关键!)
因为你是在cPanel部署自定义Next.js服务器,必须确保/.htaccess文件正确处理basePath的路由转发。创建或修改项目根目录的.htaccess文件,添加以下规则:
RewriteEngine On # 设置RewriteBase为你的basePath RewriteBase /twenty-test/ # 直接访问根路径时跳转到index.html RewriteRule ^$ index.html [L] # 静态资源直接返回,非静态资源转发到index.html(Next.js的SPA路由) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.html [L]
如果没有正确设置RewriteBase,cPanel的服务器会无法将带/twenty-test前缀的请求转发到你的Next应用,导致Auth接口无法被正确解析。
4. 验证环境变量与请求路径
在自定义登录页的getServerSideProps中添加调试代码,确认环境变量是否正确加载:
export async function getServerSideProps(context) { console.log("NEXTAUTH_URL:", process.env.NEXTAUTH_URL); console.log("Current Request Path:", context.resolvedUrl); return { props: { csrfToken: await getCsrfToken(context) } } }
如果打印的NEXTAUTH_URL不是https://example.com/twenty-test,说明环境变量没有在cPanel中生效,你可以在.htaccess中手动添加:
SetEnv NEXTAUTH_URL "https://example.com/twenty-test"
5. 清除缓存并重新部署
最后,清除cPanel的服务器缓存,重新上传项目代码,确保所有配置变更都生效。旧缓存可能会导致配置不更新,引发路径错误。
按照以上步骤调整后,/api/auth/session接口应该会正确请求https://example.com/twenty-test/api/auth/session,解决404问题。
内容的提问来源于stack exchange,提问作者Luis Felipe R. Hübner




