2011-12-15 51 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服務器的功能。