PHP에서 404의 URL을 테스트하는 쉬운 방법은 무엇입니까?

나는 몇 가지 기본적인 긁기를 가르치고 있으며 때로는 코드에 공급하는 URL이 404를 반환한다는 것을 알았습니다. 이는 나머지 모든 코드를 요약합니다.

따라서 코드 상단에 URL이 404를 반환하는지 확인하는 테스트가 필요합니다.

이것은 간단한 작업처럼 보이지만 Google은 대답을하지 않습니다. 잘못된 것을 찾는 것이 걱정입니다.

한 블로그에서 이것을 사용하도록 권장했습니다.

$valid = @fsockopen($url, 80, $errno, $errstr, 30);

비어 있는지 아닌지 $ valid인지 확인하십시오.

그러나 문제를 일으키는 URL에 리디렉션이 있다고 생각하므로 모든 값에 대해 $ valid가 비어 있습니다. 아니면 다른 일을하고있을 수도 있습니다.

또한 “헤드 요청”을 살펴 보았지만 아직 플레이하거나 시도 할 수있는 실제 코드 예제를 아직 찾지 못했습니다.

제안? 그리고 컬에 관한 이것은 무엇입니까?



답변

PHP의 curl바인딩을 사용하는 경우 다음을 사용 하여 오류 코드를 확인할 수 있습니다 curl_getinfo.

$handle = curl_init($url);
curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);

/* 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);
if($httpCode == 404) {
    /* Handle 404 here. */
}

curl_close($handle);

/* Handle $response here. */


답변

실행중인 php5 인 경우 다음을 사용할 수 있습니다.

$url = 'http://www.example.com';
print_r(get_headers($url, 1));

php4를 사용하는 사용자는 다음을 기여했습니다.

/**
This is a modified version of code from "stuart at sixletterwords dot com", at 14-Sep-2005 04:52. This version tries to emulate get_headers() function at PHP4. I think it works fairly well, and is simple. It is not the best emulation available, but it works.

Features:
- supports (and requires) full URLs.
- supports changing of default port in URL.
- stops downloading from socket as soon as end-of-headers is detected.

Limitations:
- only gets the root URL (see line with "GET / HTTP/1.1").
- don't support HTTPS (nor the default HTTPS port).
*/

if(!function_exists('get_headers'))
{
    function get_headers($url,$format=0)
    {
        $url=parse_url($url);
        $end = "\r\n\r\n";
        $fp = fsockopen($url['host'], (empty($url['port'])?80:$url['port']), $errno, $errstr, 30);
        if ($fp)
        {
            $out  = "GET / HTTP/1.1\r\n";
            $out .= "Host: ".$url['host']."\r\n";
            $out .= "Connection: Close\r\n\r\n";
            $var  = '';
            fwrite($fp, $out);
            while (!feof($fp))
            {
                $var.=fgets($fp, 1280);
                if(strpos($var,$end))
                    break;
            }
            fclose($fp);

            $var=preg_replace("/\r\n\r\n.*\$/",'',$var);
            $var=explode("\r\n",$var);
            if($format)
            {
                foreach($var as $i)
                {
                    if(preg_match('/^([a-zA-Z -]+): +(.*)$/',$i,$parts))
                        $v[$parts[1]]=$parts[2];
                }
                return $v;
            }
            else
                return $var;
        }
    }
}

둘 다 다음과 유사한 결과를 갖습니다.

Array
(
    [0] => HTTP/1.1 200 OK
    [Date] => Sat, 29 May 2004 12:28:14 GMT
    [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
    [ETag] => "3f80f-1b6-3e1cb03b"
    [Accept-Ranges] => bytes
    [Content-Length] => 438
    [Connection] => close
    [Content-Type] => text/html
)

따라서 헤더 응답이 정상인지 확인하십시오.

$headers = get_headers($url, 1);
if ($headers[0] == 'HTTP/1.1 200 OK') {
//valid 
}

if ($headers[0] == 'HTTP/1.1 301 Moved Permanently') {
//moved or redirect page
}

W3C 코드 및 정의


답변

스 트래 거 코드를 사용하면 CURLINFO_HTTP_CODE에서 다른 코드를 확인할 수도 있습니다. 일부 웹 사이트는 404를보고하지 않고 단순히 사용자 지정 404 페이지로 리디렉션하고 302 (리디렉션) 또는 이와 유사한 것을 반환합니다. 실제 파일 (예 : robots.txt)이 서버에 존재하는지 여부를 확인하는 데 사용했습니다. 분명히 이런 종류의 파일은 존재하는 경우 리디렉션을 유발하지 않지만, 그렇지 않은 경우 이전에 404 코드가 없을 수있는 404 페이지로 리디렉션됩니다.

function is_404($url) {
    $handle = curl_init($url);
    curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);

    /* 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) {
        return false;
    } else {
        return true;
    }
}


답변

strager가 제안했듯이 cURL을 사용하십시오. curl_setopt 를 사용하여 CURLOPT_NOBODY를 설정 하여 전체 페이지 다운로드를 건너 뛸 수도 있습니다 (헤더 만 원함).


답변

가장 쉬운 해결책을 찾고 있다면 php5에서 한 번에 시도 할 수 있습니다.

file_get_contents('www.yoursite.com');
//and check by echoing
echo $http_response_header[0];


답변

나는이 대답을 여기 에서 발견 했다 .

if(($twitter_XML_raw=file_get_contents($timeline))==false){
    // Retrieve HTTP status code
    list($version,$status_code,$msg) = explode(' ',$http_response_header[0], 3);

    // Check the HTTP Status code
    switch($status_code) {
        case 200:
                $error_status="200: Success";
                break;
        case 401:
                $error_status="401: Login failure.  Try logging out and back in.  Password are ONLY used when posting.";
                break;
        case 400:
                $error_status="400: Invalid request.  You may have exceeded your rate limit.";
                break;
        case 404:
                $error_status="404: Not found.  This shouldn't happen.  Please let me know what happened using the feedback link above.";
                break;
        case 500:
                $error_status="500: Twitter servers replied with an error. Hopefully they'll be OK soon!";
                break;
        case 502:
                $error_status="502: Twitter servers may be down or being upgraded. Hopefully they'll be OK soon!";
                break;
        case 503:
                $error_status="503: Twitter service unavailable. Hopefully they'll be OK soon!";
                break;
        default:
                $error_status="Undocumented error: " . $status_code;
                break;
    }

기본적으로 “file get contents”메소드를 사용하여 URL을 검색하면 http 응답 헤더 변수가 상태 코드로 자동 채워집니다.


답변

URL이 200을 반환하지 않으면 true가됩니다.

function check_404($url) {
   $headers=get_headers($url, 1);
   if ($headers[0]!='HTTP/1.1 200 OK') return true; else return false;
}