Apache2部署T3栈应用tRPC首查询路径被截断问题求助
排查与解决Apache子目录部署T3栈Next.js应用的tRPC接口异常问题
问题描述
基于T3栈+Next UI开发的Next.js应用部署到Apache2服务器子目录/application后,页面访问、登录、数据库初始化均正常,但tRPC API请求出现异常:
- 批量请求时,首个查询的接口路径会被截断前3个字符,例如
user.getAll变为r.getAll,返回404错误 - 单独请求
user.getAll失败,后续查询却能正常执行
Apache2反向代理配置
<Location "/application"> ProxyPreserveHost On ProxyPass http://localhost:3001/application ProxyPassReverse http://localhost:3001/application </Location>
依赖版本
{ "@next-auth/prisma-adapter": "1.0.7", "@nextui-org/react": "2.2.9", "@prisma/client": "5.7.0", "@t3-oss/env-nextjs": "0.7.1", "@tanstack/react-query": "4.36.1", "@trpc/client": "10.44.1", "@trpc/next": "10.44.1", "@trpc/react-query": "10.44.1", "@trpc/server": "10.44.1", "bcryptjs": "2.4.3", "framer-motion": "10.16.16", "next": "14.0.4", "next-auth": "4.24.5", "react": "18.2.0", "react-dom": "18.2.0", "superjson": "2.2.1", "zod": "3.22.4" }
tRPC接口定义已确认无误,以下是排查及解决方法:
排查方向与解决方案
1. 修正Apache反向代理配置
Apache的Location与ProxyPass组合可能因路径匹配规则导致请求截断,修改配置如下:
<Location "/application/"> ProxyPreserveHost On ProxyPass http://localhost:3001/ ProxyPassReverse http://localhost:3001/ </Location>
- 在
Location路径末尾添加斜杠/,消除路径匹配歧义 ProxyPass直接指向Next.js应用根路径,让Next.js自行处理路由映射
2. 配置Next.js的basePath
在项目根目录的next.config.js中添加子目录前缀配置:
/** @type {import('next').NextConfig} */ const nextConfig = { basePath: '/application', // 保留原有其他配置 } module.exports = nextConfig
该配置会让Next.js自动为所有路由、资源路径添加/application前缀,确保tRPC生成的API路径正确。
3. 验证tRPC客户端路径配置
检查tRPC客户端初始化代码(通常位于src/utils/trpc.ts),确保API路径包含正确的子目录前缀:
import { httpBatchLink } from '@trpc/client'; import { createTRPCNext } from '@trpc/next'; import type { AppRouter } from '@/server/api/root'; export const trpc = createTRPCNext<AppRouter>({ config({ ctx }) { return { links: [ httpBatchLink({ url: `${process.env.NEXT_PUBLIC_APP_URL}/api/trpc`, // 或直接写死:'/application/api/trpc' }), ], }; }, ssr: false, });
4. 确认Apache代理模块启用
确保Apache已启用必要的代理模块:
sudo a2enmod proxy proxy_http sudo systemctl restart apache2
未启用模块可能导致请求处理逻辑异常,引发路径截断问题。
5. 启用Apache日志排查请求路径
修改Apache虚拟主机配置,开启详细访问日志:
CustomLog ${APACHE_LOG_DIR}/application_access.log combined
重启Apache后触发tRPC请求,查看日志中记录的实际请求URL,确认是否存在路径截断,进一步定位问题根源。
内容的提问来源于stack exchange,提问作者Yuizz
相关产品推荐
相关产品推荐

