我构建代理服务器,它工作得很好,但有一些他无法处理的网站。 我试图将问题简化为核心,这就是我提出的: 我的测试用例是: http://bits.wikimedia.org/en.wikipedia.org/load.php 这是每个维基百科页面中传输的http消息之一。 所以我试着建立一个请求并通过这样的套接字发送它:
String request1 =
"GET http://bits.wikimedia.org/en.wikipedia.org/load.php HTTP/1.1" +
"\r\n" +
"Host: bits.wikimedia.org" + "\r\n" +
"User-Agent: MyHttpProxy/example.java (http://stackoverflow.com/q/5924490/319266)" +
"\r\n" + "\r\n";
但是我得到了404返回代码 - 这很奇怪,因为这个页面确实存在! 我做了很多尝试并提出了一个新的请求,只有在请求行中才有所不同:
String request2 =
"GET /en.wikipedia.org/load.php HTTP/1.1" +
"\r\n" +
"Host: bits.wikimedia.org" +
"\r\n" +
"User-Agent: MyHttpProxy/example.java (http://stackoverflow.com/q/5924490/319266)" +
"\r\n" + "\r\n";
它有效!一个好的200被带回来了 一些不重要的内容(“/ *没有要求的模块.Max让我把它放在这里* /”)
谁能告诉我这里的问题是什么? 我看着rfc,我无法理解这一点...
Here是运行此测试并打印结果的源代码:
答案 0 :(得分:4)
只有当您通过代理服务器时才会在请求行中提供完整的URL。对Web服务器的直接请求需要遵循示例中request2
中的表单。
查看源代码,您将请求发送到端口80,几乎100%意味着它们不通过代理。我的猜测是你需要将request1
发送到端口8080或你的代理正在监听的任何端口。
至于RFC,请查看section 5.1.2。请注意,绝对路径用于代理,以及与原始服务器的相对路径。