是什么导致apache添加连接关闭标头

时间:2015-05-22 20:32:42

标签: php apache safari websocket http-headers

我正在实现websockets,我让它在任何地方工作除了safari之外,它要求HTTP Connection标头等于Upgrade。我使用PHP来执行header("Connection: Upgrade", true);但是Apache总是返回HTTP标头Connection:Upgrade, close。 Safari似乎是唯一一个拒绝在javascript控制台错误close的连接头中出现Error during WebSocket handshake: 'Connection' header value is not 'Upgrade'的浏览器。

我的Apache配置文件包含:

SetEnvIfNoCase Request_URI .ws. no-gzip nokeepalive downgrade-1.0 force-response-1.0 dont-vary

每件事都在SSL端口443上,f.y.i。

HTTP HEADERS

HTTP/1.1 GET请求

Accept-Encoding: gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:Upgrade
Cookie:__qca=[...]; _ga=[...]; PHPSESSID=[...]; [...]
Host:[...]
Origin:[...]
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:[...]
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:[...]

HTTP状态101 Switching Protocols响应

Connection:Upgrade, close
Content-Type:text/html
Date:[...]
Sec-WebSocket-Accept:[...]
Sec-WebSocket-Location:wss://[...]
Sec-WebSocket-Origin:http://[...]
Server:Apache
Upgrade:WebSocket

1 个答案:

答案 0 :(得分:0)

我不能接受这个作为答案,但这是我迄今为止最好的......

通过Apache正常通过端口80启动websocket,如果有错误,则将websocket重定向到一个任意端口,该端口运行独立于Apache的自定义websocket服务器,以便可以正确控制连接头。

这方面的一个巨大缺点是safari ios上的websocket永远不会在具有限制性防火墙的教育或商业网络中工作。因此,这个答案是不可接受的。