我不想向 Facebook、Twitter 访客展示广告

问题描述

我现在在 facebook 上使用此代码“https”是活跃的 wordpress 网站。

<?PHP

    $ref = $_SERVER['HTTP_REFERER'];
    if (strpos($ref,'facebook.com') != false) {

?>

DON'T SHOW ADS

<?PHP } else { ?>

SHOW ADS

<?PHP }   ?>

代码适用于 Facebook。我想添加推特,但是当我添加推特时,它根本不起作用。我试过了。

if (strpos($ref,'facebook.com','twitter.com','t.co') != false) {

它没有那样工作。如果 else 查询或“假”是正确的?我怎样才能以最简单的方式做到这一点?如果访问者来自 Facebook、Twitter,我不想展示广告。谢谢

解决方法

strpos() 不会检查多个要查找的“针”。您可以将它们存储在数组中 并单独迭代每个:

<?php
    
    $ref = $_SERVER['HTTP_REFERER'];

    $sitesWithAdsHidden = [
        'facebook.com','twitter.com','t.co',];
    
    $isHiddenSite = false;
    foreach ($sitesWithAdsHidden as $site) {
        if (strpos($ref,$site) !== false) {
            $isHiddenSite = true;
            break;
        }
    }

    if ($isHiddenSite) {

?>

DON'T SHOW ADS

<?php } else { ?>

SHOW ADS

<?php }   ?>

请注意,我还将 strpos 比较更改为 !==,因为如果位置实际上是 0(字符串的开头),则非严格检查可能会导致评估为 false .

,

首先,直接来自Wikipedia

"referrer 字段是 Web 浏览器向 Web 服务器发送的 HTTP 请求的可选部分。"

因此,您应该始终检查请求中是否存在 Http Referer。您可以通过使用 !empty()isset() 来实现这一点,但是,为了将来的可维护性,您也可以使用 array_diffarray_keys

然后您也可以实现这一点,而无需使用 preg_match 迭代数组。

if(!array_diff(['HTTP_REFERER'],array_keys($_SERVER)))
    if(preg_match('/facebook|twitter/',$_SERVER['HTTP_REFERER']))
        // todo: disable adverts

您也可以使用 null cascading operator 将其减少为一行。如果您不需要对 $_SERVER 全局变量进行进一步检查,请执行此操作。

if(preg_match('/facebook|twitter/',$_SERVER['HTTP_REFERER'] ?? ''))
        // todo: disable adverts