Express路由在生产服务器不生效,访问/test返回404如何解决?
问题排查方案
1 优先验证代码本身有效性
你贴出的代码逻辑没有问题,路由定义顺序也符合Express优先级规则,先在本地启动服务,分别访问http://localhost:3000和http://localhost:3000/test,确认两个接口返回正常,排除本地代码逻辑错误。
2 排查生产环境反向代理配置
这是该类问题最常见的诱因,生产环境一般会用Nginx、Apache、IIS等作为上层服务反向代理请求到Node进程:
- 确认反向代理规则是否把所有域名下的请求都完整转发到Node服务监听的端口,很多错误配置只会转发根路径
/的请求,子路径/test的请求被上层服务当成静态资源查找,自然返回404。
举个常见的错误Nginx配置参考:
# 错误配置:单独拦截了/test路径作为静态资源目录 location /test { root /var/www/static; } location / { proxy_pass http://127.0.0.1:3000; }
- 如果用IIS+iisnode部署,检查web.config的重写规则,是否把所有请求都转发到app.js入口,没有对子路径做额外拦截。
3 验证请求路径匹配规则
- 确认你访问的生产地址路径和路由定义是否一致,比如是否多了部署前缀,比如实际访问的是
https://yourdomain.com/project/test,但路由只定义了/test,就会出现匹配失败。 - 检查生产环境是否开启了大小写敏感路由
app.set('case sensitive routing', true),如果访问的是/Test大写开头的路径也会返回404。
4 确认请求是否真正到达Node服务
如果你用pm2等进程管理工具托管Node服务,执行pm2 logs查看运行日志,访问/test时如果日志里没有对应的请求记录,就可以100%确定请求被上层反向代理拦截,重点排查第二步的代理配置即可。
内容的提问来源于stack exchange,提问作者Naven Pather
相关产品推荐
相关产品推荐

