47

我正在设计一个 RESTful API,其中一些调用是通过 HTTP 公开的,而一些调用需要 API 密钥和通过 HTTPS 加密。如果将 HTTP 请求发送到私有资源之一,我正在考虑应该发送什么响应代码。到目前为止,唯一对我跳出来的是412 - Precondition Failed,但标准表明前提条件是由请求者而不是服务器强加的。

是否有适合这种情况的响应代码,还是我只需要屈服并执行400

4

5 回答 5

29

我不能说这是否被 HTTP 客户端广泛接受,但严格来说 RFC,服务器应该响应:

HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade

来源:
https ://www.rfc-editor.org/rfc/rfc2817#section-4.2

于 2010-03-31T20:06:54.000 回答
7

强制 HTTP 客户端使用 HTTPS 的最安全方法是HTTP Strict Transport Security

以前一个常见的建议是断开连接,但这种做法已被删除,取而代之的是 HSTS(OWASP 网站)。

于 2014-01-31T17:03:52.633 回答
6

返回的相应错误代码类似于403.4-SSL required

尽管RFC 中没有明确记录 HTTP 1.1,但这种行为确实符合那里列出的要求:

服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。如果请求方法不是 HEAD 并且服务器希望公开请求未完成的原因,它应该在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态代码 404(未找到)来代替。

添加您自己的子代码(如 SSL 示例)在某些情况下可能会有所帮助,但由于此子代码对第三方没有意义,我建议不要这样做。

因此,您的最终错误消息将类似于“403 - Private Resource”。请注意,即使在缺少 API 密钥的情况下,也不应使用“401 - Unauthorized”,除非您的 API 密钥实际上可以在 WWW-Authenticate 标头字段中传输。

于 2010-03-31T16:53:41.380 回答
4

返回带有原因短语“ HTTPS Required ”的403似乎是一个实用的选项,也是我使用的。

https://en.wikipedia.org/wiki/HTTP_403

重定向 REST Api 不是一个好主意,尤其是因为您可能不知道如何或什么正在使用您的服务。

于 2016-01-20T11:57:23.863 回答
0

只需将重定向发送到相应的 https: URI。

更新

这是一个错误的答案 - 请参阅下面的评论

于 2010-03-31T21:21:48.370 回答