2011-12-15 17 views
0

我想在我的脚本中黑名单中的某些URL。我想根据主要URL阻止所有子域,子文件夹(www和非www版本)等。即...如何使用PHP创建URL黑名单?

subdomain.baddomain.com 
baddomain.com/subfolder/file.php 
www.baddomain.com/subfolder/file.php 

正则表达式是最好的吗?如果是这样,怎么样?

+0

你怎么阻止他们?这是使用`.htaccess`,你是用PHP来做的,还是它是一个不同的,奇怪的解决方案? – Bojangles 2011-12-15 00:14:11

+1

这是一个Apache服务器吗?可能通过.htaccess – 2011-12-15 00:15:41

+0

更容易。脚本就像书签服务一样。我想阻止某些网域被标记为书签。 .htaccess不会在这里工作 – 2011-12-15 00:18:12

回答

2

下应该做的伎俩:

if(in_array(parse_url($url, PHP_URL_HOST), $blacklist)) { 
    //blacklisted addr 
} 
1

科尔宾的回答只会阻止露骨匹配这意味着你必须输入你要拦截的每个站点/子组合。如果您只有两个域名,如“www.domain.com”&“domain.com”,则这不是问题。如果你有几十,几百或几千,那么这将是一个真正的头痛。这个函数有点强大,因为它检查被禁止的域名字符串是否在域名的任何部分,它也比较慢:)。

$bannedDomains = array('banned.com') // blocks top level & subdomains. 
function bannedDomain($url, $bannedDomains) { 
    $domain = parse_url($url, PHP_HOST_URL); 
    foreach($bannedDomains as $bannedDomain) { 
    if (strpos($domain, $bannedDomain) !== false) { 
     return true; 
    } 
    } 
    return false; 
} 

有一个警告这里为好,因为它是盲目的字符串匹配有关闭的机会,你可以有一个人做这样的事情“www.banned.com.notbanned.com”作为域名,因为禁止域名字符串在该域名内,那么你最终会阻止一个有效的域名。考虑到各种顶级域名&子域名,域名匹配&实际上非常困难。

此外,如果您只使用显式匹配,那么使用您的域作为关联数组中的键的效率更高&然后使用isset()检测它们是否存在于禁用列表中。

$bannedDomains = array(
'www.banned.com' => true, 
'banned.com' => true 
); 

function bannedDomain($url, $bannedDomains) { 
$domain = parse_url($url, PHP_HOST_URL); 
return isset($bannedDomains[$domain]); 
} 

如果你真的需要一个超级强大的系统,那么你最好使用一个数据库中查找或使用HTTP服务器的功能。