Apache 2.4反向代理WebSocket连接提示Connection头无upgrade token如何解决
问题根因
你当前的VirtualHost配置存在2个核心错误导致WebSocket请求无法正常转发:
- 路径匹配规则错误
你的WebSocket实际请求路径是/crownies/ws/upload/file,但你写的RewriteRule规则是匹配^/ws(.*),也就是路径以/ws开头的请求才会触发WebSocket代理,实际你的请求路径前缀是/crownies/ws,完全匹配不上这条规则,导致WebSocket请求被后面的普通HTTP代理规则转发,普通HTTP代理不会传递Upgrade、Connection这类WebSocket专用头,所以Golang服务端识别不到WebSocket协议。 - 缺少必要的头传递配置
即使路径匹配正确,你没有明确配置代理时保留WebSocket所需的升级头,部分Apache版本默认不会主动传递这些头,也会导致同样的报错。
修复步骤
第一步:确认已启用必要的Apache模块
先执行以下命令开启所需模块,重启Apache生效:
# CentOS8环境执行 sudo dnf install mod_proxy_wstunnel -y sudo a2enmod proxy proxy_http proxy_wstunnel rewrite sudo systemctl restart httpd
如果提示a2enmod命令不存在,也可以直接编辑Apache配置文件加载对应模块,确认以下行没有被注释:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so LoadModule rewrite_module modules/mod_rewrite.so
第二步:修改VirtualHost配置
替换原来的Rewrite规则和Proxy配置即可,修改后的对应部分如下:
RewriteEngine On # 修正路径匹配规则,适配你的/crownies/ws前缀的请求 RewriteCond %{HTTP:Connection} Upgrade [NC] RewriteCond %{HTTP:Upgrade} websocket [NC] RewriteRule ^/crownies/ws(.*) ws://localhost:8080/crownies/ws$1 [P,L] # 明确配置普通代理和WebSocket代理的头传递 ProxyRequests off # 追加WebSocket头传递规则 ProxyPassMatch ^/crownies/ws(.*) ws://localhost:8080/crownies/ws$1 upgrade=WebSocket ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ # 强制传递升级相关头 RequestHeader set Upgrade "websocket" env=UPGRADE RequestHeader set Connection "Upgrade" env=UPGRADE
修改完后验证配置语法再重启Apache:
sudo httpd -t sudo systemctl restart httpd
测试即可正常建立WebSocket连接。
内容的提问来源于stack exchange,提问作者gbenroscience
相关产品推荐
相关产品推荐

