【问题标题】:URLencoding in HTTP request for spaceHTTP 空间请求中的 URL 编码
【发布时间】:2013-06-13 10:17:12
【问题描述】:

为什么空格字符 URL 编码为 %20? 我看不出将空格视为保留字符的原因。

【问题讨论】:

  • 此评论没有任何建设性。

标签: html http url


【解决方案1】:

因为一个HTTP请求的Request-Line被定义为:

Method (Space) Request-URI (Space) HTTP-Version CRLF

严格遵守规范的原始 HTTP 服务器会执行以下操作:

splitInput = requestLine.Split(' ')

method = splitInput[0]
requestUri = splitInput[1]
httpVersion = splitInput[2]

如果您在 URL 中允许空格,那将会中断。

【讨论】:

  • 公平地说,这可能是鸡和蛋的问题。 HTTP 协议看起来像它的样子是因为 URL 语法允许它,还是 URL 被建模为不破坏 HTTP 语法? HTTP 语法可能不同... :)
【解决方案2】:

因为在很多情况下(带有参数的程序、HTTP 命令等),空格被用作分隔符,所以它通常必须被转义,在 unix 命令行中使用 \,在 windows 命令行中使用周围的 " , %20 在 URL 等中。

在 HTTP 协议中,当您尝试访问 http://www.foo.com 时,您的浏览器会在端口 80 上打开与服务器 www.foo.com 的连接,并发送命令:

GET http://www.foo.com HTTP/1.0    
Accept : text/html

语法是“METHOD URL HTTPVERSION”

如果您尝试请求 http://www.foo.com/my page.html 而不是 http://www.foo.com/my%20page.html,服务器会认为“page.html”是您正在寻找的 HTTPVersion...

【讨论】:

  • 在互联网的曙光中,一个定义(限制性地)定义了允许的字符,URLS 很简单,并且在许多情况下添加空格意味着繁琐的引用。 想想如何让 URL 以空格结尾。 ;)
  • 域名到IP地址的解析是什么时候发生的?浏览器在发送 GET 请求之前这样做还是浏览器在发送 GET 请求之前将域名解析为 IP 地址?
  • 浏览器在发送GET之前必须打开连接,所以它解析域名,通过它的IP连接到服务器,然后发送GET命令......(或多或少^^)
【解决方案3】:

RFC 3986 Section 2.3:

2.3.  Unreserved Characters

   Characters that are allowed in a URI but do not have a reserved
   purpose are called unreserved.  These include uppercase and lowercase
   letters, decimal digits, hyphen, period, underscore, and tilde.

      unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多