cPanel部署Node.js Express仅根路由生效 其余路由失效问题
cPanel部署Express仅根路由可用的修复方案
核心问题
- 路由前缀不匹配:本地运行时服务直接监听端口,路由路径直接匹配
/category、/user这类路径,但部署到cPanel后实际访问的路径带/api前缀(如https://example.com/api/category/getallcats),服务端没有对应前缀的路由配置,所有非根路径请求无法命中对应路由。 - 兜底路由写法错误:现有代码中
app.use('/',(req,resp)=>{resp.status(200).send("ok");})会匹配所有HTTP方法、任意路径的请求,只要前面的路由没命中就会直接返回"ok",这就是所有路径都返回根路由响应的直接原因。 - 可能存在.htaccess重写规则冲突:如果网站根目录配置了把所有请求重写到静态首页/PHP入口的规则,会先把请求拦截,无法转发到Node.js服务。
修复步骤
- 统一补全路由前缀
把所有路由、静态资源的挂载路径统一加上/api前缀,和线上访问路径对齐,修改对应代码:
// 静态资源路径修改 app.use("/api/upload", express.static(process.cwd() + "/upload")); // 业务路由修改 const userRoute = require("./routes/userRoute"); app.use("/api/user", userRoute); const provinceRoute = require("./routes/provinceRoute"); app.use("/api/province", provinceRoute); const adverbRoute = require("./routes/adverbRoute"); app.use("/api/adverb", adverbRoute); const catSubRoute = require("./routes/catSubRoute"); app.use("/api/category", catSubRoute); const uploadRoute = require("./routes/upload"); app.use("/api/upload", uploadRoute);
- 修正兜底路由逻辑
把原来拦截所有请求的兜底路由改成仅匹配/api根路径的GET请求,可额外加404规则方便排查未匹配路径:
// 仅响应/api根路径的ok app.get('/api',(req,resp)=>{ resp.status(200).send("ok"); }) // 未命中路由返回404 app.use((req, res) => { res.status(404).send("Route not found"); })
- 检查重写规则
登录cPanel进入文件管理器,打开网站根目录的.htaccess文件,删除所有把/api/*路径强制重写到根目录、或者转发到PHP入口的规则,cPanel Node.js应用会自动配置正确的转发规则,不需要手动添加重写。 - 重启应用
代码上传完成后,进入cPanel的「Setup Node.js App」页面,找到对应应用点击Restart重启,修改才会生效。
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

