PHP - 检查最终的URL是否存在

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

我能做些什么?我希望我做得很好。

+0

考虑到你正在专门检查页面是否为404,检查'if($ httpCode!= 404)'是否更有意义? –

+0

您可以使用'CURLINFO_REDIRECT_URL'确定重定向目标,然后根据这个决定,如果给定的URL是有效的。 – Philipp

+0

为什么不使用'CURLOPT_FOLLOWLOCATION'使它跟随重定向并返回最终结果? – Barmar

您可以告诉cURL遵循所有重定向,并从最终重定向返回结果。使用:

curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true); 
+0

这工作正常,但除此之外,我不得不再增加一行cURL: curl_setopt($ handle,CURLOPT_USERAGENT,“Mozilla/4.0(compatible; MSIE 5.01; Windows NT 5.0)”); – Kokox

+0

这似乎是特定的网站,如果它关心用户代理是什么。 – Barmar

+0

它也应该是一个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,大多数浏览器都会呕吐,所以这可能是一个相当安全的数字,也是一种安全行为。否则,如果您点击错误配置的网址,最终可能会永久重定向。