1

我们有一面旗帜。此横幅位于不同的站点合作伙伴上。我们没有这些网站的管理员权限。横幅必须在每个站点上。但是如何控制呢?它可以手动完成,但如果有办法自动完成(尤其是当站点列表很大时),那就太好了。横幅必须可见。这意味着仅检查每个站点上的 HTML 代码是不够的。必须考虑 JavaScript 和 CSS,因为使用这些工具可以轻松隐藏横幅。我认为这是一项常见任务,但我在网上找不到任何东西。任何想法和链接将不胜感激。

4

1 回答 1

1

总之:没办法。这意味着 - 您不能确定横幅是否会 100% 出现在您合作伙伴网站的每位访问者身上。

为什么这是不可能的?

  • 首先,诸如AdBlock之类的东西——是的,即使一切顺利,大多数人也不想看到广告,所以他们可以随意使用任何工具来禁用它。重要提示:AdBlock 将在发送请求和从服务器检索内容之前检查请求 URI ,因此它的工作方案是“加载前阻止”,而不是“加载然后隐藏”。这意味着 - 如果您的横幅将被添加到黑名单中 - 客户不会提出任何请求。
  • 好的,让我们假设我们已经把所有客户端的东西都放在一边,只处理合作伙伴的网站。即从那里我们假设客户没有阻止您的横幅出现的“邪恶”事物:

我们能做些什么?

乍一看,使用 PHP在环境变量中有HTTP_REFERER字段。$_SERVER使用它,您可以检查哪个网站请求了您的横幅。让它成为一个图像,这样您就可以轻松地执行您的检查:

function checkReferer($referer)
{
   //this could also be retrieved from config or DB:
   $clients = [
      //client name with available referrers:
      'Lorem Ipsum' => ['page1_address.php', 'page2_address.php']
   ];
   //get client:
   $client = key(array_filter($clients, function($referrers) use ($referer)
   {
      return in_array($referer, $referrers);
   }));
   //perform some DB updates, which set state of $client
}

//some stuff
checkReferer($_SERVER['HTTP_REFERER']);

//sending image:
$image = '/path/to/image.png';
header('Content-Type: image/png');
readfile($image);
exit();

这个怎么运作?它将检索banner.php请求脚本的网页地址。并非所有客户端都会发送此标头(我的意思是HTTP_REFERER- 它不是强制性的),但在大多数情况下,它将包含有效地址。在这种情况下,您可能会依赖这一点,因为您会正确地得到它是您的合作伙伴的利益(因为您正在检查它们)。所以:当访问者打开您合作伙伴的网站时,您的脚本将被请求。例子:

<!-- somewhere on partner's side in HTML: -->
<img src='http://your-site.com/banner.php'/>

替代方案:您可能希望拥有更坚固的条件。然后,您需要为每个合作伙伴分配一些唯一代码并告诉它该代码。您的图像将如下所示:

<img src='http://your-site.com/banner.php?code=codeOfThisPartner'/>

- 在 PHP 中,您将只1:1在合作伙伴及其代码之间建立关系:

function checkPartner($code)
{
   //this could also be retrieved from config or DB:
   $clients = [
      'codeOfThisPartner' => 'Lorem Ipsum',
      //...
   ];
   //get client:
   $client = $clients[$code];
   //perform some DB updates, which set state of $client
}
//the rest is the same, code will be in $_GET['code'], obviously

这有什么问题?

如果我们假设客户的浏览器没有禁用广告,那么上述方法仅适用于合作伙伴的网站没有隐藏您的横幅的情况。正如您所提到的,可能有隐藏您的横幅的 javascript。例如,他们可以执行脚本调用,然后将其隐藏在隐藏块中。所以——这是一种只过滤好伙伴的方法。

还有什么方法可以推荐?

例如,您可以尝试使用cURL请求您合作伙伴的页面。由于您提到您的横幅将有许多合作伙伴的页面,因此您最好使用curl_multi_*来提高查询速度。算法将是:

  • 请求合作伙伴的网站
  • 检查您的横幅是否存在于 HTML 代码中。例如,您可以询问您的合作伙伴放置横幅的严格形式(甚至可能是横幅链接中的某些合作伙伴的代码)

JavaScript 呢?

常见答案:没有。有数百万种方法可以破坏您的横幅。还有数百万种方法可以隐藏这一事实,即 html/javascript 中的某些内容正在破坏您的横幅(.eval()在 javascript 中,是的)。除非您使用 javascript 引擎和 html 渲染器编写完整的浏览器仿真,否则您无法自动检查(即使在那里也很难回答“横幅是否会出现在屏幕的正确位置”的问题)。如果您不信任您的合作伙伴,那么很遗憾,您将不得不手动检查该网站——也就是说,您只有亲眼检查才能 100% 确定。

边注

您还应该记住,不同的网络浏览器会以不同的方式处理标记。因此,在某些情况下,它可能不是“邪恶的伙伴,隐藏你的横幅”,而是“不支持功能“X”或功能“Y”等的愚蠢浏览器”。也许它也可以被视为您的合作伙伴方面的问题,但要明确这一点 - 您应该告诉他,哪些浏览器必须正确显示横幅。

那么该怎么办?

无法进行全自动检查并不意味着您不应该做任何事情。您可以执行某种检查,就像上面的建议一样 - 我认为。这会将您的合作伙伴分为两部分:通过您检查的部分和未通过检查的部分。因此,至少您不必手动检查第一部分- 因此,这是一种节省时间的方法。第二部分只能手动检查以确保 100% 确定 - 每个特定情况都应单独处理,这样您就可以确定这是您的合作伙伴 100% 的错。

于 2013-11-08T09:58:16.323 回答