【问题标题】:Control existence and appearence of a banner on different sites控制横幅在不同站点上的存在和外观
【发布时间】:2013-11-08 09:11:50
【问题描述】:

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

【问题讨论】:

  • 你的横幅是什么?只是形象?闪光?还有什么?
  • 图像和闪存。但如果任务需要,我们可以只使用一张图片。

标签: php banner


【解决方案1】:

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

为什么不可能?

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

我们能做什么?

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

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 中的某些内容正在破坏您的横幅(在 javascript 中是.eval(),是的)。除非您使用 javascript 引擎和 html 渲染器编写完整的浏览器仿真,否则您无法自动检查(即使在那里也很难回答“横幅是否会出现在屏幕的正确位置”的问题)。如果您不信任您的合作伙伴,那么很遗憾,您将不得不手动检查该网站 - 即,您将 100% 确定只有亲眼检查

旁注

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

那么,该怎么办?

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

【讨论】:

  • 感谢您的明确回答,Alma!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2013-08-19
  • 2016-08-03
相关资源
最近更新 更多