在GET请求中处理完全限定域的正确方法是什么?

时间:2011-02-11 21:21:43

标签: http proxy http-headers get dns

我正在编写代理服务器。当我使用curl来获取页面时,比如http://www.foo.com/pants,curl会发出以下请求:

GET /pants HTTP/1.1

当我有curl通过我的本地代理发送该请求时,curl将GET请求更改为:

GET http://www.foo.com/pants HTTP/1.1

此更改导致foo.com服务器返回404.foo.com是否已损坏?或者是完全合格的域名只对代理服务器有意义吗?我是否应该始终从发出的请求中删除http://domain

谢谢!

3 个答案:

答案 0 :(得分:3)

引自rfc 2616, section 5.1.2 "Request-URI",强调我:

  

当向代理发出请求时,absoluteURI表单是必需的。请求代理转发请求或从有效缓存中为其提供服务,并返回响应。请注意,代理可以将请求转发到另一个代理或直接转发到absoluteURI指定的服务器。为了避免请求循环,代理必须能够识别其所有服务器名称,包括任何别名,本地变体和数字IP地址。请求行的示例如下:

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
     

为了允许在未来版本的HTTP中转换为所有请求中的absoluteURI,所有HTTP / 1.1服务器必须接受请求中的absoluteURI表单,即使HTTP / 1.1客户端只会在请求中生成它们代理人。

答案 1 :(得分:2)

由于此代理必须与服务器建立上游连接,因此curl(和其他兼容的用户代理)会发送完整的URL。 您的代理必须剥离主机名,将其解析为IP,连接上游,然后发送GET /pants HTTP/1.1

答案 2 :(得分:1)

当客户端通过基于HTTP的代理发送请求时,它必须指定完整的URL,因为代理可能支持可以用URL表示的多个目标协议(即:HTTP,FTP等)。在将URL传递给下一个服务器时,代理有责任按下URL并将数据请求为更合适的格式。