为什么 URL 中的百分号会导致 HTTP 400 Bad Request 错误?

igl*_*vzx 24 apache-http-server http webserver nginx

我在 Web 浏览器中错误输入网页的 URL 时偶然发现了这一点。

为什么访问http://example.com/%会导致抛出 HTTP 400 Bad Request 错误?服务器是否在百分号之后或之前期待其他内容?

这似乎发生在 Apache 和 Nginx 服务器上。

and*_*415 34

简答

根据RFC 3986,裸%字符不是有效的URI语法;它后面应该跟两个有意义的十六进制数字。

长答案

你得到的HTTP状态码属于这个4xx类:

4xx: Client Error - The request contains bad syntax or cannot be fulfilled

来源:超文本传输​​协议 (HTTP) 状态代码注册表

特别是,互联网工程任务组(IETF) 在RFC 2616 中400定义了代码:

10.4.1 400 错误请求

由于语法格式错误,服务器无法理解该请求。客户端不应该在没有修改的情况下重复请求。

来源:RFC 2616 - 超文本传输​​协议 - HTTP/1.1

引用维基百科(粗体强调我的):

URI 中允许的字符是保留的或未保留的或作为百分比编码的一部分的百分比字符)。

来源:百分比编码 - URI 中的百分比编码

如果要插入文字%符号,则需要使用其百分比编码表示:%25

进一步阅读


LPC*_*hip 9

百分号用于插入 url 中通常不支持的字符。例如 %20 与空格相同。

  • 并插入一个百分比字符本身,它是`%25` (5认同)
  • + 是仅在查询字符串中的空格的正确编码。%20 是 url 中其他地方的正确编码。 (3认同)