PHP-重定向后使用cURL获取最终的URL状态

时间:2018-10-24 07:52:59

标签: php php-curl

在某些可能的重定向之后,我正在使用此功能来获取最终URL的状态:

function getUrlStatus($url) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, true);    // we want headers
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    
        curl_exec($ch);

        $httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $redirectURL = curl_getinfo($ch, CURLINFO_REDIRECT_URL);
        curl_close($ch);

        if($httpStatus >= 300 && $httpStatus < 400) {
            getUrlStatus($redirectURL);
        } else {
            return $httpStatus;
        }
    }

如果我检查的第一个URL未重定向,则可以正常工作并显示状态,但是如果正在检查重定向的URL(因此,递归调用getUrlStatus函数),结果似乎是NULL

var_dump(getUrlStatus($url));   //   NULL

我正在检查多个URL,并且所有URL的状态均为307,因此它们都再次调用了该函数,因此正在显示NULL。请告知我我在做什么错。谢谢!

1 个答案:

答案 0 :(得分:1)

您正在寻找 CURLOPT_FOLLOWLOCATION

TRUE to follow any "Location: " header that the server sends as part of the HTTP header (note this is recursive, PHP will follow as many "Location: " headers that it is sent, unless CURLOPT_MAXREDIRS is set). 来自:http://docs.php.net/manual/da/function.curl-setopt.php

如果您不打算使用选项CURLOPT_FOLLOWLOCATION,则必须确保正确分析标题以获取状态。 在http://php.net/manual/en/function.curl-getinfo.php中,您可以看到 CURLINFO_HTTP_CODE - The last response code.(...) 这意味着:可以有多个状态代码。 即使用http://airbrake.io/login发送了两个:

HTTP/1.1 301 Moved Permanently
(...)

HTTP/1.1 200 OK
(...)

这意味着将仅返回200,并且如果您想获得任何结果,则您的函数需要如下所示:

 if($httpStatus >= 300 && $httpStatus < 400) {
     return getUrlStatus($redirectURL);
 } else {
     return $httpStatus;
 }