我正在编写代理服务器。当我使用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?
谢谢!
答案 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并将数据请求为更合适的格式。