HTTP 1.1请求行
我建立了代理服务器,它工作得很好,但有一些网站,他无法处理。 我试图将问题缩小到核心,这就是我想到的: 我的测试用例是: 这是每个维基百科页面中传输的http消息之一。 所以我尝试为它构建一个请求,并通过如下套接字发送:HTTP 1.1请求行,http,proxy,Http,Proxy,我建立了代理服务器,它工作得很好,但有一些网站,他无法处理。 我试图将问题缩小到核心,这就是我想到的: 我的测试用例是: 这是每个维基百科页面中传输的http消息之一。 所以我尝试为它构建一个请求,并通过如下套接字发送: String request1 = "GET http://bits.wikimedia.org/en.wikipedia.org/load.php HTTP/1.1" + "\r\n" + "Host: bits.wikimedia.org" +
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人被带回来了
一些不重要的内容/*未请求模块。马克斯让我把这个放在这里*/
谁能告诉我这里有什么问题吗?
我看了rfc,我找不出任何理由
是运行此测试并打印结果的源代码:仅当您通过代理服务器时,才会在请求行中提供完整的URL。对web服务器的直接请求需要遵循示例中request2中的格式 查看源代码,您将请求发送到端口80,这几乎100%意味着它们没有通过代理。我猜您需要将request1发送到端口8080或您的代理正在侦听的任何端口
至于RFC,请看一看。请注意,绝对路径与代理一起使用,相对路径与源服务器一起使用。只有通过代理服务器才能在请求行中提供完整的URL。对web服务器的直接请求需要遵循示例中request2中的格式 查看源代码,您将请求发送到端口80,这几乎100%意味着它们没有通过代理。我猜您需要将request1发送到端口8080或您的代理正在侦听的任何端口
至于RFC,请看一看。请注意,绝对路径与代理一起使用,相对路径与源服务器一起使用。从技术上讲,服务器也应该接受绝对语法,但许多服务器不接受。您好!首先感谢您的回复。如何判断我的请求是否通过服务器?假设我想创建一个透明的代理服务器,我如何判断我的请求是转到代理服务器还是直接转到源服务器?e、 g:还有上面的。顺便说一句:我在stackoverflow中没有15分,因此我仍然无法将答案标记为有用,但它确实有用!你好如果您正在编写一个透明的代理服务器,那么实际上您无法在客户端级别进行区分-这就是透明的全部要点。在这种情况下,我的大部分答覆并不适用。如果您自己编写一个代理,那么您应该在它的日志中看到它是否看到了请求。或者,您可以进行流量捕获,查看对等IP是代理IP还是源服务器IP。从技术上讲,服务器也应该接受绝对语法,但许多服务器不接受。您好!首先感谢您的回复。如何判断我的请求是否通过服务器?假设我想创建一个透明的代理服务器,我如何判断我的请求是转到代理服务器还是直接转到源服务器?e、 g:还有上面的。顺便说一句:我在stackoverflow中没有15分,因此我仍然无法将答案标记为有用,但它确实有用!你好如果您正在编写一个透明的代理服务器,那么实际上您无法在客户端级别进行区分-这就是透明的全部要点。在这种情况下,我的大部分答覆并不适用。如果您自己编写一个代理,那么您应该在它的日志中看到它是否看到了请求。或者,您可以执行流量捕获,并查看对等IP是代理IP还是源服务器IP。