You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nginx/Passenger环境下实现Websocket Upgrade透传?

托管站点WebSocket请求头透传问题解决办法

问题根源

你的情况是托管环境的Nginx或Passenger默认修改了Connection请求头,导致WebSocket的升级握手失败——WebSocket依赖Connection: upgrade和Upgrade: websocket这两个头完成协议切换,一旦头被篡改,握手就无法完成。

.htaccess配置方案(分环境)

1. Passenger托管环境

如果你的站点用Passenger运行Node.js,在根目录的.htaccess中添加以下配置,强制保留升级相关请求头并启用WebSocket支持:

# 强制透传WebSocket升级所需的请求头
PassengerPreserveHeader Connection
PassengerPreserveHeader Upgrade

# 开启Passenger的WebSocket支持
PassengerEnableWebSocket on

2. Apache前端代理环境

如果托管平台用Apache做反向代理,添加这些规则来转发WebSocket请求并保留头信息(注意替换路径和端口为你的实际配置):

RewriteEngine On

# 匹配你的WebSocket路径(比如/ws,根据你的应用调整)
RewriteCond %{REQUEST_URI} ^/ws$
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
# 转发到本地Node.js服务的端口(比如3000)
RewriteRule ^ ws://localhost:3000%{REQUEST_URI} [P,L]

# 确保响应头正确传递
Header always set Connection "upgrade" env=websocket

备选方案(若.htaccess无效)

  • 联系托管服务商:直接要求他们在服务器配置中添加WebSocket支持规则,你可以把这段Nginx配置发给客服参考:
    location /ws {
        proxy_pass http://localhost:3000; # 替换为你的Node.js服务地址
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
    
  • 适配平台内置WebSocket服务:部分托管商提供现成的WebSocket支持(比如特定的部署流程或应用插件),查看平台文档调整你的应用部署方式,适配他们的方案。

验证步骤

配置完成后,用Postman重新发起WebSocket连接,查看Node.js服务的请求日志:

  • 确认收到Connection: upgrade和Upgrade: websocket头
  • 检查是否完成握手并建立持久连接

内容的提问来源于stack exchange,提问作者Sharpeye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:12:08