使用 IdHTTPProxyServer 检测主要 URL

Detecting main URL with IdHTTPProxyServer

我想申请重定向网站。 它有一个 table 和 "domains" 和 "redirect domains"。 一旦匹配域,它就会重定向到重定向域。 如果不匹配,则重定向到默认页面。 所以我用 IdHTTPProxyServer 创建了一个 Delphi 应用程序。 我已将其配置为使用 "ssleay32.dll" 和 "libeay32.dll" 甚至可以使用 https。 一切都很好。 它使用 "IdHTTPProxyServerHTTPBeforeCommand" 事件像这样重定向:

with AContext.Connection.IOHandler do
begin
  WriteLn('HTTP/1.0 302 Moved Temporarily');
  WriteLn('Location: ' + RedirectURL);
  WriteLn('Connection: close');
  WriteLn;
end;

但是如何区分主要 URL(用户在地址栏中输入)和其他 URL 的事件调用? "IdHTTPProxyServerHTTPBeforeCommand" 当为统计计数器、Facebook 之类的按钮等加载页面时,事件调用了很多次。我不想将它们全部重定向到默认页面。

如果 IdHTTPProxyServer 无法做到这一点,Delphi 或任何其他语言(可以生成本机 executable。首选 C++)是否有其他选项?

谢谢

从代理(或目标 HTTP 服务器)的角度来看, user-typed URL 之间没有任何区别和 其他 URLs。每个 HTTP 请求都是 self-contained 并且独立于每个其他 HTTP 请求。他们必须在 per-request 的基础上处理 as-is。

如果你想忽略相关的 URLs(图像、脚本等),你必须提前知道 initial URL 是,解析从 URL 中检索到的数据,跟踪数据引用的任何 URL,然后如果您看到稍后请求它们,则忽略这些 URL。但是,HTTP 协议中没有任何内容告诉您 initial URL 是什么。有一个 Referer 请求 header 有时可能会有所帮助,因为当浏览器请求依赖资源文件时它会被填充,但当用户从一个页面导航到另一个页面时它也会被填充, 所以你不能单独依赖 Referer 。您将必须实施自己的发现逻辑,以根据对给定客户端随时间请求的 URL 的更多分析找出 初始 URL。

只有客户端真正知道它在请求什么以及为什么,代理只是到达它的网关。所以只有这么多智能过滤你可以在代理中做而不知道客户端实际在做什么。