Heroku上Express服务器返回HTTP/1.1 426 Upgrade Required问题求助
解决方案
1. 检查Express路由与WebSocket中间件的隔离
确保WebSocket相关的中间件(如ws、socket.io)仅挂载在指定路径,而非全局拦截所有HTTP请求:
- 示例(使用
socket.io):// 正确:仅在/ws路径处理WebSocket连接 const io = require('socket.io')(server, { path: '/ws' }); // 错误:全局挂载会导致普通HTTP请求被WebSocket逻辑拦截 // const io = require('socket.io')(server);
2. 验证Heroku部署配置
- 检查
Procfile的启动命令,确保启动的是完整的Express服务,而非仅WebSocket进程。 - 执行
heroku logs --tail查看服务器启动日志,确认Express服务正常初始化,无异常中间件加载提示。
3. 排查全局中间件的强制升级逻辑
检查是否存在全局中间件(如自定义安全校验、第三方插件)错误地对所有请求返回426 Upgrade Required响应。可以临时禁用非必要中间件,逐步恢复以定位问题来源。
4. 确认端口配置正确性
确保Express服务器监听Heroku提供的PORT环境变量,而非固定端口:
const port = process.env.PORT || 3000; server.listen(port, () => { console.log(`Server running on port ${port}`); });
错误的端口配置会导致Heroku路由层无法正确转发HTTP请求,触发异常响应。
5. 调整WebSocket库的传输配置
如果使用socket.io,避免强制仅使用WebSocket传输,允许HTTP轮询作为备选(防止普通HTTP请求被拦截):
const io = require('socket.io')(server, { transports: ['websocket', 'polling'], path: '/ws' });
使用ws库时,检查是否设置了可能干扰HTTP路由的选项(如clientTracking: true)。
6. 重置Heroku运行环境
- 执行
heroku restart重启dyno,排除进程状态异常问题。 - 重新推送代码触发部署,确保最新代码正确加载。
内容的提问来源于stack exchange,提问作者Neoz
相关产品推荐
相关产品推荐

