问题描述
我现在在 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_diff
和 array_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