对于HTTP,可以通过301响应将所有请求升级为HTTPS。
对于websocket,然而,它似乎不那么容易。如果我将ws://127.0.0.1请求重定向到wss:/127.0.0.1,使用websocket.org上的测试,我在浏览器中得到一个"错误:未定义"(是的,证书是受信任的,如果直接使用则适用于wss)。发出初始请求,并发送重定向。但是,在TLS端口上没有第二个请求。
规范只简要介绍了重定向。
- 可以将ws升级到wss吗?
- 我需要发送WebSocket特定的头甚至重定向响应?(目前,我没有-规范列出了在完成握手之前重定向) 还有什么我想念的吗?
对于HTTP,可以通过301响应将所有请求升级为HTTPS。
(nitpick)这不是一个真正的请求升级,而是一个重定向,导致一个不同的请求。
可以将ws升级到wss吗?
根据websocket标准(RFC 6455):
如果从服务器接收到的状态码不是101,则客户端根据HTTP [RFC2616]过程处理响应。在特别是,客户端可能执行身份验证,如果它接收401状态码;服务器可能重定向客户端使用3xx状态码(但客户端不需要遵循)) 等。
所以是的,它可能被一些客户端支持,但不被其他客户端支持。例如,在Firefox中,相关属性network.websocket.auto-follow-http-redirects
默认为false,即默认情况下它不遵循重定向。
我需要发送WebSocket特定的头甚至重定向响应?
这些只与升级到websocket的请求相关,而与重定向无关。这意味着头应该只在升级响应(状态码101)中发送。
这取决于webSocket客户端实现是否处理3xx状态码。webSocket规范不需要客户端实现这样做。以下是规范中的一段话:
如果从服务器接收到的状态码不是101,则客户端根据HTTP [RFC2616]过程处理响应。在特别是,客户端可能执行身份验证,如果它接收401状态码;服务器可能会重定向客户端使用3xx状态码(但客户端不需要遵循)),等等。否则,按以下步骤进行。