PHP - 检查最终的URL是否存在
我知道有方法可以验证URL是否返回404。 我一直在使用下面的功能,它一直在正常工作,但我的问题是,我想验证一个域的URL重定向到一个子域取决于我的地区使用的语言。PHP - 检查最终的URL是否存在
function page_404($url) {
$handle = curl_init($url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
/* Get the HTML or whatever is linked in $url. */
$response = curl_exec($handle);
/* Check for 404 (file not found). */
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
curl_close($handle);
/* If the document has loaded successfully without any redirection or error */
if ($httpCode >= 200 && $httpCode < 300) {
echo $httpCode."<br/>";
return false;
} else {
echo $httpCode."<br/>";
return true;
}
}
例如:
https://example.com/video/123456
我重定向到以下网址:
https://es.example.com/video/123456
这意味着它是一个HTTP代码 “301” 和我的功能检测为重定向,因此给了我视频不存在的答案,但实际上它只存在于我重定向到该子域的域。
如果我将$ httpCode < 300改为$ httpCode < 303就行。
但问题是,当它接收到这个页面的无效链接重定向我的主要网站,所以我没有收到一个404码,它会为我一个301或303
我能做些什么?我希望我做得很好。
您可以告诉cURL
遵循所有重定向,并从最终重定向返回结果。使用:
curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);
这工作正常,但除此之外,我不得不再增加一行cURL: curl_setopt($ handle,CURLOPT_USERAGENT,“Mozilla/4.0(compatible; MSIE 5.01; Windows NT 5.0)”); – Kokox
这似乎是特定的网站,如果它关心用户代理是什么。 – Barmar
它也应该是一个HEAD请求。 – Misunderstood
你会想做这个递归,因为你可以重定向到一个页面,重定向到一个页面......好吧,你明白了。你想知道最后一页是否存在。而且你不知道要达到那里需要多少重定向。
你想有条件后:
if ($httpCode >= 200 && $httpCode < 300) {
事情是这样的:
} elseif ($httpCode >= 301 && $httpCode <= 302) {
(假设重定向代码是301和302 ..有可能是别人,我不是包括,所以相应地调整)。然后在这里,抓住你被导向的URL,然后让这个函数调用它自己的URL。它会为每个重定向执行此操作。
不过,如果你做这种方式,您可能希望让你知道你有多少次叫这个,像添加第二个参数:
function page_404($url, $iteration = 1)
因此,当你调用它以后,你这样做是这样的:
page_404($url, $iteration + 1);
然后,在最开始,做一个检查,以确保你在无限的重定向结束:
if($iteration > 10) {
echo "Too many redirects";
return (some error);
}
如果遇到重定向10或15次的URL,大多数浏览器都会呕吐,所以这可能是一个相当安全的数字,也是一种安全行为。否则,如果您点击错误配置的网址,最终可能会永久重定向。
考虑到你正在专门检查页面是否为404,检查'if($ httpCode!= 404)'是否更有意义? –
您可以使用'CURLINFO_REDIRECT_URL'确定重定向目标,然后根据这个决定,如果给定的URL是有效的。 – Philipp
为什么不使用'CURLOPT_FOLLOWLOCATION'使它跟随重定向并返回最终结果? – Barmar