【问题标题】:Detecting main URL with IdHTTPProxyServer使用 IdHTTPProxyServer 检测主 URL
【发布时间】:2015-01-15 00:08:28
【问题描述】:

我想制作一个重定向网站的应用程序。 它有一个带有“域”和“重定向域”的表。 一旦它匹配域,它就会重定向到重定向域。 如果不匹配,则重定向到默认页面。 所以我用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 或任何其他语言中是否有其他选项(可以生成本机可执行文件。首选 C++)?

谢谢

【问题讨论】:

    标签: delphi redirect proxy indy


    【解决方案1】:

    从代理(或目标 HTTP 服务器)的角度来看,用户键入的 URL 和 其他 URL 之间没有任何区别。每个 HTTP 请求都是自包含的,并且独立于所有其他 HTTP 请求。他们必须根据每个请求按原样处理。

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

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

    【讨论】:

    • 谢谢,这会有所帮助。 “推荐人”就足够了。如果从另一个页面引用,它不必重定向。但是如何检查标题中是否有“Referer”的天气?我试过“AContext.Connection.IOHandler.ReadStrings”。但它没有读取任何内容,之后也没有加载页面
    • OnHTTPBeforeCommand 事件中,使用AContext.Headers 属性,因为在触发事件之前已经读取了标头。
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2018-05-30
    相关资源
    最近更新 更多