Einfache Möglichkeit, eine URL auf 404 in PHP zu testen?

Lesezeit: 8 Minuten

Ich bringe mir selbst etwas grundlegendes Scraping bei und habe festgestellt, dass manchmal die URLs, die ich in meinen Code einfüge, 404 zurückgeben, was den ganzen Rest meines Codes verklebt.

Ich brauche also einen Test am Anfang des Codes, um zu überprüfen, ob die URL 404 zurückgibt oder nicht.

Dies scheint eine ziemlich einfache Aufgabe zu sein, aber Google gibt mir keine Antworten. Ich mache mir Sorgen, dass ich nach den falschen Sachen suche.

Ein Blog empfahl mir, dies zu verwenden:

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

und dann testen, ob $valid leer ist oder nicht.

Aber ich denke, die URL, die mir Probleme bereitet, hat eine Weiterleitung, sodass $valid für alle Werte leer ist. Oder vielleicht mache ich etwas anderes falsch.

Ich habe mir auch eine “Kopfanfrage” angesehen, aber ich habe noch keine tatsächlichen Codebeispiele gefunden, mit denen ich spielen oder die ich ausprobieren kann.

Vorschläge? Und was hat es mit Locken auf sich?

Einfache Moglichkeit eine URL auf 404 in PHP zu testen
Nachzügler

Wenn Sie PHP verwenden curl Bindungenkönnen Sie den Fehlercode mit überprüfen curl_getinfo so wie:

$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. */

  • Ich bin noch nicht mit cURL vertraut, daher fehlen mir einige Konzepte. Was mache ich mit der $response-Variable unten? Was enthält es?

    bflora

    3. Januar 2009 um 1:09 Uhr

  • @bflora, ich habe einen Fehler im Code gemacht. (Wird in einer Sekunde behoben.) Sie können die Dokumentation für curl_exec auf der PHP-Site einsehen.

    – Nachzügler

    3. Januar 2009 um 1:24 Uhr

  • @bflora $response enthält den Inhalt der $url, sodass Sie zusätzliche Dinge tun können, z. B. den Inhalt auf bestimmte Zeichenfolgen oder was auch immer überprüfen. In Ihrem Fall interessiert Sie nur der 404-Status, sodass Sie sich wahrscheinlich keine Gedanken über $response machen müssen.

    – Beau Simensen

    3. Januar 2009 um 1:42 Uhr

  • Was ist, wenn Sie nur Header laden möchten, anstatt die gesamte Datei herunterzuladen?

    – Patrick

    11. März 2014 um 22:28 Uhr

  • @patrick dann musst du angeben curl_setopt($handle, CURLOPT_NOBODY, true); vor dem Laufen curl_exec

    – Benutzer

    28. November 2014 um 3:39 Uhr

1646637849 762 Einfache Moglichkeit eine URL auf 404 in PHP zu testen
Asziant

Wenn Sie php5 ausführen, können Sie Folgendes verwenden:

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

Alternativ mit php4 hat ein Benutzer Folgendes beigetragen:

/**
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;
        }
    }
}

Beide hätten ein ähnliches Ergebnis wie:

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
)

Daher könnten Sie einfach überprüfen, ob die Header-Antwort in Ordnung war, z.

$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-Codes und Definitionen

  • Ich habe einige Formatierungsverbesserungen an Ihrer Antwort vorgenommen und die Fähigkeit für https hinzugefügt: get_headers($https_url,1,443); Ich bin sicher, dass es funktionieren wird, obwohl es nicht im Standard ist get_headers() Funktion.. Fühlen Sie sich frei, es zu testen und mit einem Status dafür zu antworten.

    – JamesM-SiteGen

    6. Februar 2011 um 5:07 Uhr

  • nette Problemumgehung für php4, aber für solche Fälle haben wir die HEAD http-Methode.

    – vidstige

    16. Januar 2013 um 21:16 Uhr

  • Das wäre also tatsächlich schneller als die Curl-Methode?

    – FLIEGEN

    15. Februar 2013 um 8:37 Uhr

  • Diese Lösung ist nicht gültig, wenn die Ziel-URL auf 404 umleitet. In diesem Fall $headers[0] wird ein Umleitungscode sein, und der endgültige 404-Code wird irgendwo später an das zurückgegebene Array angehängt.

    – Roomcays

    17. Oktober 2013 um 16:33 Uhr

  • Dies ist in PHP mehr Mühe als es wert ist, den tatsächlichen Code aus der resultierenden Zeichenfolge herauszufiltern, wenn versucht wird, einfach mit dem Statuscode in einem Skript umzugehen, anstatt das Ergebnis zum Lesen zurückzugeben.

    – Kzqai

    10. Juni 2016 um 18:51 Uhr

1646637850 334 Einfache Moglichkeit eine URL auf 404 in PHP zu testen
Aram Kocharyan

Mit dem Code von strager können Sie den CURLINFO_HTTP_CODE auch auf andere Codes überprüfen. Einige Websites melden keinen 404-Fehler, sondern leiten einfach auf eine benutzerdefinierte 404-Seite um und geben 302 (Weiterleitung) oder etwas Ähnliches zurück. Ich habe dies verwendet, um zu überprüfen, ob eine tatsächliche Datei (z. B. robots.txt) auf dem Server existiert oder nicht. Natürlich würde diese Art von Datei keine Weiterleitung verursachen, wenn sie vorhanden wäre, aber wenn dies nicht der Fall wäre, würde sie auf eine 404-Seite umleiten, die, wie ich bereits sagte, möglicherweise keinen 404-Code enthält.

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;
    }
}

  • +1 für die Verwendung von “Erfolgs”-HTTP-Codes anstelle von 404 … Der Benutzer kann eine erhalten 408 Request Timeoutkein 404

    – Guillaume

    5. Mai 2013 um 12:20 Uhr

  • Hat wie ein Zauber funktioniert. Damit prüfe ich, ob ein Artikel bei ebay noch online ist.

    – Nerdkowski

    26. Januar 2016 um 13:36 Uhr

  • Für diejenigen, die erwarten, dass der obige Code mit https funktioniert, versuchen Sie Folgendes hinzuzufügen: curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, FALSE);

    – Kirk Hammett

    19. Oktober 2017 um 18:52 Uhr


  • aber dies würde auch 404 =true zurückgeben, wenn es eine legitime 302-Umleitung gibt?

    – Robert Sinclair

    31. Oktober 2018 um 15:20 Uhr

Wie Strager vorschlägt, sollten Sie sich die Verwendung von cURL ansehen. Sie könnten auch daran interessiert sein, CURLOPT_NOBODY mit zu setzen curl_setopt um das Herunterladen der gesamten Seite zu überspringen (Sie möchten nur die Kopfzeilen).

Wenn Sie nach einer einfachsten Lösung suchen und die können Sie in einem Rutsch auf php5 tun

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

  • Übrigens, wenn Sie dies und die URL 404 tun, wird eine Warnung ausgegeben, die eine Ausgabe verursacht.

    – Christa K

    10. Januar 2015 um 10:39 Uhr

  • einfacher zu machen $isExists= @file_get_contents(‘www.yoursite.com’); if ($isExists !== true) { echo “ergibt 404” }

    – Tebe

    16. Dezember 2017 um 22:03 Uhr


  • Setzen Sie einen Try-Catch ein und handhaben Sie dann den 404 mit Catch

    – Garet Claborn

    1. Mai 2018 um 20:12 Uhr

1646637850 577 Einfache Moglichkeit eine URL auf 404 in PHP zu testen
Roß

Ich habe diese Antwort gefunden Hier:

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;
    }

Im Wesentlichen verwenden Sie die Methode „file get content“, um die URL abzurufen, die automatisch die HTTP-Response-Header-Variable mit dem Statuscode füllt.

  • Übrigens, wenn Sie dies und die URL 404 tun, wird eine Warnung ausgegeben, die eine Ausgabe verursacht.

    – Christa K

    10. Januar 2015 um 10:39 Uhr

  • einfacher zu machen $isExists= @file_get_contents(‘www.yoursite.com’); if ($isExists !== true) { echo “ergibt 404” }

    – Tebe

    16. Dezember 2017 um 22:03 Uhr


  • Setzen Sie einen Try-Catch ein und handhaben Sie dann den 404 mit Catch

    – Garet Claborn

    1. Mai 2018 um 20:12 Uhr

Einfache Moglichkeit eine URL auf 404 in PHP zu testen
Jürgen

Dies gibt Ihnen wahr, wenn die URL nicht 200 OK zurückgibt

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

  • Dies ist viel schneller als die Verwendung von cURL, wenn Sie eine einfache Bool-Prüfung einer URL durchführen möchten. Danke.

    – Drmzindec

    6. Mai 2019 um 12:41 Uhr

963940cookie-checkEinfache Möglichkeit, eine URL auf 404 in PHP zu testen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy