NodeJs 镜像网站代理

3
当收到请求时,如何编写一个简单的服务器来镜像网站?例如,访问运行NodeJS的http://localhost:5000将呈现cnn.com及其所有图像。这被称为透明代理吗?
我不想要需要在浏览器设置中配置实际代理的东西,而是通过传递请求来提供另一个站点的镜像。

Node.JS(或任何基于HTTP的东西)真的不是做这件事的最佳方式。像SOCKS代理这样的东西是否适合您?它们要简单得多,而且不需要除具备SSH功能的服务器之外的任何东西。 - Dan Hlavenka
1个回答

4

首先,让我确定我理解了你的问题。

你希望用户浏览http://mynodeproxy.example.com并且在他们的浏览器中呈现的页面与http://cnn.com相同。对吗?

答案是:你不能按照你想象的那样做。这有两种方法可以实现:

  1. 用户在浏览器设置中配置真正的代理服务器(这就是为什么所有浏览器都支持配置代理服务器的原因)。您可以使用现有的代理服务器或尝试使用node和一些专门的应用程序逻辑编写自己的代理服务器。但是重点是用户不会在浏览器地址栏中输入您的代理地址。他们将您的代理地址键入到其浏览器设置的“代理服务器”字段中,并仍然在浏览器地址栏中键入“http://cnn.com”。

  2. 如果您控制来自网络的所有出站流量,则可以执行类似酒店的技巧,例如DNS劫持或将所有流量路由通过您的代理。

但是,如果让用户在浏览器地址栏中输入您的穿透代理服务器地址,这将行不通,因为您的代理从CNN.com获取的HTML将具有指向其他cnn.com资源(站点上的其他页面、图像、字体、CSS、JS等)的超链接。如果这些链接包括主机名而不是相对于包含HTML文档,则浏览器将直接连接到cnn.com以加载它们,绕过您的代理。
现在想象一下CNN HTML有一个链接,比如查看CNN首页。当用户点击它时会发生什么?没错,您的代理完全被忽略了。这就是为什么代理服务器需要浏览器明确支持的原因。
一旦CNN.com的javascript开始执行像制作ajax请求、动态添加DOM等操作,您将看到简单地代理和修改初始的cnn.com主页HTML是不可能的。是的,您可以为极其琐碎的编造示例网页做到这一点,但在现实中,像cnn.com这样的现代热门网站是不可行的。

我不想代理所有请求,只是让http://localhost:8000提供cnn.com,并且仅限于此。我不需要常规代理,也不需要在浏览器设置中配置,而只是希望有一种方式可以转发请求,以便我提供某个站点的镜像。 - Verhogen
所以,“只是cnn.com”很可能会有数十个请求,包括来自许多其他主机(如内容交付网络、YouTube等)的内容。这是一个“网络”。它并不简单。 - Peter Lyons
我完全理解。与域外有关的内容是可以接受的,但是所有涉及同一域的内容都应该被转发/镜像。 - Verhogen
我认为你已经很好地重新表述了问题,但我认为有一种方法可以在浏览器中不配置实际的http代理的情况下完成。请参见http://tomodo.com/。我知道并非所有东西都能正常工作(比如链接,你指出了这一点),但只要初始渲染可以通过并且XHR可以传递就可以了。 - Verhogen
1
所以,http-proxy模块是你的朋友,但是说实话它很复杂,没有人能够根据不知道你认为必需和可以破坏的内容来准确回答问题,所以如果你希望有人给你粘贴代码片段,我想没有人会这样做。如果你只需要将其通过phantomjs渲染成图像并发送回屏幕截图,那么你也可以这样做。 - Peter Lyons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接