我有百万(1,000,000)域列表。
+----+--------------+--------------------------+
| Id | Domain_Name | Correct_URL |
+----+--------------+--------------------------+
| 1 | example1.com | http://www.example1.com |
| 2 | example2.com | https://exmple2.com |
| 3 | example3.com | https://www.example3.com |
| 3 | example4.com | http://example4.com |
+----+--------------+--------------------------+
ID
和Domain_Name
列已填充。Correct_URL
列为空。 问题:我需要填写Correct_URL
列。
我面临的问题是如何在域之前找到前缀部分。它可能是http://
或http://www.
或https://
或https://www.
如何使用PHP正确找到上述内容4?请注意,我需要为所有1,000,000个域运行代码....所以我正在寻找一种检查它的最快方法...
答案 0 :(得分:6)
除了向每种可能性发出HTTP请求之外,没有其他任何方法,看看你是否得到了回复。
当您断言“它可能是http://或http://www。或https://或https://www。”时,真实世界域可能会提供零,某些或全部或那些(以及其他各种),他们可以通过OK或重定向或身份验证错误等来响应请求。
HTTP和HTTPS不是Web应用程序的属性;它们是由端点(Web服务器或应用程序防火墙等)处理的通信协议。
与任何网络通信一样,必须分别探测主机(在这种情况下“www”是主机)和端口(不一定,但最常见)端口80和443。这种探测是一种喊叫,然后你等着看另一边是否有服务在听。
答案 1 :(得分:2)
根据已知网址,您可以使用get_headers
拨打http和/或https版本,您可以确定https是否可用,http是否重定向到https等等。
答案 2 :(得分:2)
因此,我必须构建一个类似的系统来验证用户提供的URL。
最后,您需要设置优先级顺序,建议的顺序是HTTPS over HTTP,而WWW over则没有,因此您会得到如下优先级列表:
正如其他所有人所说,您将需要使用cURL进行测试。
foreach($domainRows as $domainRow){
$scheme_list = ['https://www.','https://', 'http://www.', 'http://'];
$bestUrl = false;
foreach($scheme_list as $scheme){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $scheme.$domainRow['Domain_Name']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_exec($ch);
$real_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
if($real_url){
$bestUrl = $scheme.$domainRow['Domain_Name']
break;
}
}
if($bestUrl){
// you have the best URL to use as $bestUrl save it to your DB Row
}else{
// the site is not responding to any URL's do you need to do something here?
}
}
或者基于亚历山大·霍尔曼(Alexander Holman)的答案,我完全忘记了get_headers
可以做到
foreach($domainRows as $domainRow){
$scheme_list = ['https://www.','https://', 'http://www.', 'http://'];
$bestUrl = false;
foreach($scheme_list as $scheme){
$res = get_headers($scheme.$domainRow['Domain_Name']);
// if you want to allow redirects remove/alter this part as it blocks them.
if($res && isset($res[0])){
$statusParts = explode(" ", $res[0]);
if($statusParts[1] == "200"){
$bestUrl = $scheme.$domainRow['Domain_Name'];
break;
}
}
//end of status check
//replace with below to allow all responses from server including 404
/*if($res){
$bestUrl = $scheme.$domainRow['Domain_Name'];
break;
}*/
}
if($bestUrl){
// you have the best URL to use as $bestUrl save it to your DB Row
}else{
// the site is not responding to any URL's do you need to do something here?
}
}
此代码将按优先级进行测试,匹配的第一个代码将停止对其他代码的测试,如果找不到适合的系统,则会告诉您。
感谢Supun Praneeth(我为Supun Praneeth所做的工作),并在那里增加了代码以更好地满足您的需求。
答案 3 :(得分:1)
您可以使用cURL
方法:
$url_list = ['facebook.com','google.com'];
foreach($url_list as $url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_exec($ch);
$real_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
echo $real_url;//add here your db commands
}
此操作需要花费一些时间,因为它需要最后重定向的网址。如果您只想查看其http
或https
,可以尝试以下操作:
$url_list = ['facebook.com','google.com'];
foreach($url_list as $url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_exec($ch);
$real_url = curl_getinfo($ch, CURLINFO_REDIRECT_URL);
echo $real_url;//add here your db commands
}