0

我已经使用 Java NIO 通道实现了简单的代理服务器,但是有一个问题,一些站点运行良好,但其他站点在其主机的技术页面上给出关于未知路径或重定向的错误,并显示资源不存在。是我的错还是某些网站不允许代理?

ProxyServer 是这样工作的:我输入“localhost”并在浏览器中接收在代码中设置的站点。并且来自浏览器的请求我只是以这种方式在目标站点上重新发送:

private void connect(SelectionKey key) throws IOException {
    SocketChannel channel = ((SocketChannel) key.channel());
    Attachment attachment = (Attachment) key.attachment();
    channel.write(attachment.buffer);
}

所以'key' - 是目标站点的SelectionKey,在attachment.buffer中我存储发送到代理服务器的请求。

那么,我的代码有些磨损,还是它刚刚关闭了通过站点代理的机会?

更新 1.我想,我发现了一个问题。因为我将请求从 localhost 重定向到远程服务器,所以在字段 HOST 中的请求中我有“localhost”。似乎有些站点忽略了此字段,其他站点尝试使用并重定向到 404 页面,因为找不到我要的“本地主机”。所以问题是如何在目标服务器名称的请求中更改字段“主机”?

4

2 回答 2

0

目标服务器对您的 NIO 代码一无所知,也不知道您是代理还是真正的客户端。

如果您收到错误页面,则代理正在工作,而被代理的资源就是问题所在:它不存在,您无权访问,等等。在您的代码中您无能为力,也没有你应该担心的原因。只需将错误页面发送给客户端,就像发送其他任何内容一样。

为什么该方法在未连接并执行其他操作时称为 connect() ?

于 2012-08-07T22:40:29.367 回答
0

我发现了一个问题。在代理后提交的 HOST 包含“localhost”,因此一些站点接受它,其他站点不接受。将此字段的值替换为真实主机可解决问题。

于 2012-08-20T08:59:35.230 回答