我一直在我的网站中使用重定向功能,用户被重定向到列为白名单的网站。我意识到通过传统的db调用来验证域名的过程非常耗时,因此我介绍了一种方法来将db表写入文本文件并通过匹配域名来重定向验证。所以我将白名单中的域名列表文本文件(序列化)如下
码
$trusted_domain = $_GET['go'];//these variables are taken from the url
$project_id = $_GET['project'];//these variables are taken from the url
$query = "SELECT projectid, domainname FROM domains";
$result = mysql_query($query);
while($row= mysql_fetch_assoc($result)){
$objData = $objData." ". serialize( $row). "\r\n";
}
$filePath = "data.txt";
if (is_writable($filePath)) {
$fp = fopen($filePath, "w");
fwrite($fp, $objData);
fclose($fp);
}
文本文件内容
a:2:{s:9:"projectid";s:2:"19";s:10:"domainname";s:27:"_http._sctp.www.example.com";}
a:2:{s:9:"projectid";s:2:"28";s:10:"domainname";s:11:"www.abc.com";}
a:2:{s:9:"projectid";s:2:"46";s:10:"domainname";s:11:"www.abc.com";}
a:2:{s:9:"projectid";s:2:"70";s:10:"domainname";s:12:"www.test.com";}
a:2:{s:9:"projectid";s:2:"75";s:10:"domainname";s:15:"www.bulding.com";}
a:2:{s:9:"projectid";s:2:"80";s:10:"domainname";s:11:"www.abc.com";}
a:2:{s:9:"projectid";s:2:"82";s:10:"domainname";s:11:"www.abc.com";}
a:2:{s:9:"projectid";s:3:"100";s:10:"domainname";s:47:"https://www.google.com
https://www.facebook.com";}
现在的问题是,有人能告诉我如何将两个变量$trusted_domain
和$project_id
与上面序列化文本中的每个项目和域名相匹配。我的意思是如果用户带有网址
http://trackme.domain.com/redirect?project=75&go=www.building.com
如何将值75和www.building.com
与文本文件中的内容进行比较。
答案 0 :(得分:0)
我会考虑为此设置一个Memcache服务器,特别是如果列表中有很多域。
如果您对保存文件的数据格式保持灵活,我认为以下内容对您有用。此示例使用JSON,它更快,更容易处理。
$query = "SELECT projectid, domainname FROM domains";
$result = mysql_query($query);
$objData = [];
while ($row = mysql_fetch_assoc($result)){
$objData[$row['projectid']] = $row['domainname'];
}
file_put_contents('data.txt', json_encode($objData));
然后你可以这样处理:
$trusted_domain = $_GET['go'];//these variables are taken from the url
$project_id = $_GET['project'];//these variables are taken from the url
$data = json_decode(file_get_contents('data.txt'), true);
if (isset($data[$project_id]) && $data[$project_id] === $trusted_domain)
{
// Domain matches
}
当读取JSON时,它会创建一个数组,其中项目ID是键,值是域名。
我假设project_id是唯一的,每个项目只有一个可信域。如果情况并非如此,您可能需要根据您的具体需求稍微调整一下。 E.g:
while ($row = mysql_fetch_assoc($result)){
$objData[$row['projectid']][] = $row['domainname'];
}
注意额外的[]
?这将为项目ID创建一个域名数组,然后您可以在解析文件时使用它:
if (isset($data[$project_id]) && in_array($trusted_domain, $data[$project_id])) { }
另外我应该添加,避免使用mysql_*
函数,因为它们已被弃用。请改为PDO。