Wie kann ich per PHP prüfen, ob eine URL existiert?

Lesezeit: 9 Minuten

Wie kann ich per PHP prufen ob eine URL
X10nD

Wie überprüfe ich, ob eine URL (nicht 404) in PHP existiert?

  • mögliches Duplikat von Wie kann man mit PHP prüfen, ob eine Remote-Datei existiert?

    – viam0Zah

    6. Juli 2010 um 12:44 Uhr

Wie kann ich per PHP prufen ob eine URL
karim79

Hier:

$file="http://www.example.com/somefile.jpg";
$file_headers = @get_headers($file);
if(!$file_headers || $file_headers[0] == 'HTTP/1.1 404 Not Found') {
    $exists = false;
}
else {
    $exists = true;
}

Von Hier und gleich darunter der obige Beitrag, es gibt eine kräuseln Lösung:

function url_exists($url) {
    return curl_init($url) !== false;
}

  • Ich fürchte, der CURL-Weg wird so nicht funktionieren. Schauen Sie sich das an: stackoverflow.com/questions/981954/…

    – viam0Zah

    6. Juli 2010 um 12:41 Uhr


  • Einige Websites haben eine andere $file_headers[0] auf Fehlerseite. zum Beispiel youtube.com. seine Fehlerseite mit diesem Wert als HTTP/1.0 404 Not Found(Unterschied ist 1,0 und 1,1). was tun dann?

    – Krishna Raj

    17. März 2012 um 7:34 Uhr

  • Vielleicht mit strpos($headers[0], '404 Not Found') könnte den Trick machen

    – alexandru.topliceanu

    16. April 2012 um 7:11 Uhr


  • @alexandru.topliceanu Der Textstatus „Nicht gefunden“ ist optional; Entwickler können dort einfügen, was sie wollen, es ist immer noch gültig.

    – mp

    23. Januar 2015 um 16:31 Uhr

  • @Mark stimmte zu! Um klarzustellen, strpos($headers[0], '404') ist besser!

    – alexandru.topliceanu

    26. Januar 2015 um 13:03 Uhr

Wie kann ich per PHP prufen ob eine URL
MoonLite

Wenn Sie herausfinden, ob eine URL aus PHP existiert, müssen Sie einige Dinge beachten:

  • Ist die URL selbst valide (ein String, nicht leer, gute Syntax), ist dies serverseitig schnell zu prüfen.
  • Das Warten auf eine Antwort kann einige Zeit in Anspruch nehmen und die Codeausführung blockieren.
  • Nicht alle von get_headers() zurückgegebenen Header sind wohlgeformt.
  • Verwenden Sie curl (wenn Sie können).
  • Verhindern Sie das Abrufen des gesamten Bodys/Inhalts, sondern fordern Sie nur die Header an.
  • Erwägen Sie Weiterleitungs-URLs:
  • Möchten Sie, dass der erste Code zurückgegeben wird?
  • Oder allen Weiterleitungen folgen und den letzten Code zurückgeben?
  • Sie könnten mit 200 enden, aber es könnte mithilfe von Meta-Tags oder Javascript umgeleitet werden. Herauszufinden, was danach passiert, ist schwierig.

Denken Sie daran, dass es unabhängig von der Methode, die Sie verwenden, einige Zeit dauert, bis Sie auf eine Antwort warten.
Der gesamte Code kann (und wird wahrscheinlich) anhalten, bis Sie entweder das Ergebnis kennen oder die Anforderungen abgelaufen sind.

Zum Beispiel: Der folgende Code könnte eine LANGE Zeit in Anspruch nehmen, um die Seite anzuzeigen, wenn die URLs ungültig oder nicht erreichbar sind:

<?php
$urls = getUrls(); // some function getting say 10 or more external links

foreach($urls as $k=>$url){
  // this could potentially take 0-30 seconds each
  // (more or less depending on connection, target site, timeout settings...)
  if( ! isValidUrl($url) ){
    unset($urls[$k]);
  }
}

echo "yay all done! now show my site";
foreach($urls as $url){
  echo "<a href=\"{$url}\">{$url}</a><br/>";
}

Die folgenden Funktionen könnten hilfreich sein, Sie möchten sie wahrscheinlich an Ihre Bedürfnisse anpassen:

    function isValidUrl($url){
        // first do some quick sanity checks:
        if(!$url || !is_string($url)){
            return false;
        }
        // quick check url is roughly a valid http request: ( http://blah/... ) 
        if( ! preg_match('/^http(s)?:\/\/[a-z0-9-]+(\.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $url) ){
            return false;
        }
        // the next bit could be slow:
        if(getHttpResponseCode_using_curl($url) != 200){
//      if(getHttpResponseCode_using_getheaders($url) != 200){  // use this one if you cant use curl
            return false;
        }
        // all good!
        return true;
    }
    
    function getHttpResponseCode_using_curl($url, $followredirects = true){
        // returns int responsecode, or false (if url does not exist or connection timeout occurs)
        // NOTE: could potentially take up to 0-30 seconds , blocking further code execution (more or less depending on connection, target site, and local timeout settings))
        // if $followredirects == false: return the FIRST known httpcode (ignore redirects)
        // if $followredirects == true : return the LAST  known httpcode (when redirected)
        if(! $url || ! is_string($url)){
            return false;
        }
        $ch = @curl_init($url);
        if($ch === false){
            return false;
        }
        @curl_setopt($ch, CURLOPT_HEADER         ,true);    // we want headers
        @curl_setopt($ch, CURLOPT_NOBODY         ,true);    // dont need body
        @curl_setopt($ch, CURLOPT_RETURNTRANSFER ,true);    // catch output (do NOT print!)
        if($followredirects){
            @curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,true);
            @curl_setopt($ch, CURLOPT_MAXREDIRS      ,10);  // fairly random number, but could prevent unwanted endless redirects with followlocation=true
        }else{
            @curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,false);
        }
//      @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,5);   // fairly random number (seconds)... but could prevent waiting forever to get a result
//      @curl_setopt($ch, CURLOPT_TIMEOUT        ,6);   // fairly random number (seconds)... but could prevent waiting forever to get a result
//      @curl_setopt($ch, CURLOPT_USERAGENT      ,"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1");   // pretend we're a regular browser
        @curl_exec($ch);
        if(@curl_errno($ch)){   // should be 0
            @curl_close($ch);
            return false;
        }
        $code = @curl_getinfo($ch, CURLINFO_HTTP_CODE); // note: php.net documentation shows this returns a string, but really it returns an int
        @curl_close($ch);
        return $code;
    }
    
    function getHttpResponseCode_using_getheaders($url, $followredirects = true){
        // returns string responsecode, or false if no responsecode found in headers (or url does not exist)
        // NOTE: could potentially take up to 0-30 seconds , blocking further code execution (more or less depending on connection, target site, and local timeout settings))
        // if $followredirects == false: return the FIRST known httpcode (ignore redirects)
        // if $followredirects == true : return the LAST  known httpcode (when redirected)
        if(! $url || ! is_string($url)){
            return false;
        }
        $headers = @get_headers($url);
        if($headers && is_array($headers)){
            if($followredirects){
                // we want the last errorcode, reverse array so we start at the end:
                $headers = array_reverse($headers);
            }
            foreach($headers as $hline){
                // search for things like "HTTP/1.1 200 OK" , "HTTP/1.0 200 OK" , "HTTP/1.1 301 PERMANENTLY MOVED" , "HTTP/1.1 400 Not Found" , etc.
                // note that the exact syntax/version/output differs, so there is some string magic involved here
                if(preg_match('/^HTTP\/\S+\s+([1-9][0-9][0-9])\s+.*/', $hline, $matches) ){// "HTTP/*** ### ***"
                    $code = $matches[1];
                    return $code;
                }
            }
            // no HTTP/xxx found in headers:
            return false;
        }
        // no headers :
        return false;
    }

  • aus irgendeinem Grund gibt getHttpResponseCode_using_curl() in meinem Fall immer 200 zurück.

    – TD_Nijboer

    17. April 2014 um 8:00 Uhr

  • Wenn jemand das gleiche Problem hat, überprüfen Sie die DNS-Nameserver. Verwenden Sie opendns ohne followredirects stackoverflow.com/a/11072947/1829460

    – TD_Nijboer

    17. April 2014 um 10:37 Uhr

  • +1 für die einzige Antwort auf Weiterleitungen. Geändert return $code zu if($code == 200){return true;} return false; nur Erfolge auszusortieren

    – Birel

    10. April 2016 um 21:08 Uhr

  • @PKHunter: Nein. Meine schnelle preg_match-Regex war ein einfaches Beispiel und stimmt nicht mit allen dort aufgeführten URLs überein. Siehe diese Test-URL: regex101.com/r/EpyDDc/2 Wenn Sie ein besseres wünschen, ersetzen Sie es durch das in Ihrem Link aufgeführte ( mathiasbynens.be/demo/url-regex ) von Diegoperini; es scheint zu allen zu passen, siehe diesen Testlink: regex101.com/r/qMQp23/1

    – MoonLite

    30. März 2017 um 12:21 Uhr

  • Das Finden vieler gültiger URLs gibt einen CURL-Fehler 60 auf exec zurück. “SSL-Zertifikatsproblem: Zertifikat des lokalen Ausstellers kann nicht abgerufen werden”

    – xtempore

    3. November 2021 um 1:31 Uhr

1646941449 699 Wie kann ich per PHP prufen ob eine URL
Mondnetz76

$headers = @get_headers($this->_value);
if(strpos($headers[0],'200')===false)return false;

Wenn Sie also eine Website kontaktieren und etwas anderes als 200 erhalten, wird es funktionieren

  • Aber was ist, wenn es sich um eine Weiterleitung handelt? Die Domain ist noch gültig, wird aber ausgelassen.

    – Eric Leroy

    19. Oktober 2013 um 17:06 Uhr

  • Oben in einer Zeile: return strpos(@get_headers($url)[0],'200') === false ? false : true. Könnte nützlich sein.

    – Dejv

    4. März 2015 um 13:41 Uhr

  • $this is in PHP ist eine Referenz auf das aktuelle Objekt. Referenz: php.net/manual/en/language.oop5.basic.php Grundierung: phpro.org/tutorials/Object-Oriented-Programming-with-PHP.html Höchstwahrscheinlich wurde das Code-Snippet aus einer Klasse entnommen und nicht entsprechend korrigiert.

    – Marc Witteveen

    23. April 2016 um 21:09 Uhr

  • Kommentar von Dejv verbessern -> strpos(@get_headers($url) zurückgeben[0],’200′);

    – Andreas Paul

    20. November 2020 um 12:51 Uhr

  • Es gibt viele Erfolgsantwortcodes, nicht nur 200 …

    – JuliSmz

    22. Juli 2021 um 13:49 Uhr

Sie können Curl auf bestimmten Servern nicht verwenden. Sie können diesen Code verwenden

<?php
$url="http://www.example.com";
$array = get_headers($url);
$string = $array[0];
if(strpos($string,"200"))
  {
    echo 'url exists';
  }
  else
  {
    echo 'url does not exist';
  }
?>

Ich benutze diese Funktion:

/**
 * @param $url
 * @param array $options
 * @return string
 * @throws Exception
 */
function checkURL($url, array $options = array()) {
    if (empty($url)) {
        throw new Exception('URL is empty');
    }

    // list of HTTP status codes
    $httpStatusCodes = array(
        100 => 'Continue',
        101 => 'Switching Protocols',
        102 => 'Processing',
        200 => 'OK',
        201 => 'Created',
        202 => 'Accepted',
        203 => 'Non-Authoritative Information',
        204 => 'No Content',
        205 => 'Reset Content',
        206 => 'Partial Content',
        207 => 'Multi-Status',
        208 => 'Already Reported',
        226 => 'IM Used',
        300 => 'Multiple Choices',
        301 => 'Moved Permanently',
        302 => 'Found',
        303 => 'See Other',
        304 => 'Not Modified',
        305 => 'Use Proxy',
        306 => 'Switch Proxy',
        307 => 'Temporary Redirect',
        308 => 'Permanent Redirect',
        400 => 'Bad Request',
        401 => 'Unauthorized',
        402 => 'Payment Required',
        403 => 'Forbidden',
        404 => 'Not Found',
        405 => 'Method Not Allowed',
        406 => 'Not Acceptable',
        407 => 'Proxy Authentication Required',
        408 => 'Request Timeout',
        409 => 'Conflict',
        410 => 'Gone',
        411 => 'Length Required',
        412 => 'Precondition Failed',
        413 => 'Payload Too Large',
        414 => 'Request-URI Too Long',
        415 => 'Unsupported Media Type',
        416 => 'Requested Range Not Satisfiable',
        417 => 'Expectation Failed',
        418 => 'I\'m a teapot',
        422 => 'Unprocessable Entity',
        423 => 'Locked',
        424 => 'Failed Dependency',
        425 => 'Unordered Collection',
        426 => 'Upgrade Required',
        428 => 'Precondition Required',
        429 => 'Too Many Requests',
        431 => 'Request Header Fields Too Large',
        449 => 'Retry With',
        450 => 'Blocked by Windows Parental Controls',
        500 => 'Internal Server Error',
        501 => 'Not Implemented',
        502 => 'Bad Gateway',
        503 => 'Service Unavailable',
        504 => 'Gateway Timeout',
        505 => 'HTTP Version Not Supported',
        506 => 'Variant Also Negotiates',
        507 => 'Insufficient Storage',
        508 => 'Loop Detected',
        509 => 'Bandwidth Limit Exceeded',
        510 => 'Not Extended',
        511 => 'Network Authentication Required',
        599 => 'Network Connect Timeout Error'
    );

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    if (isset($options['timeout'])) {
        $timeout = (int) $options['timeout'];
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    }

    curl_exec($ch);
    $returnedStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if (array_key_exists($returnedStatusCode, $httpStatusCodes)) {
        return "URL: '{$url}' - Error code: {$returnedStatusCode} - Definition: {$httpStatusCodes[$returnedStatusCode]}";
    } else {
        return "'{$url}' does not exist";
    }
}

1646941450 54 Wie kann ich per PHP prufen ob eine URL
Randy Skretka

$url="http://google.com";
$not_url="stp://google.com";

if (@file_get_contents($url)): echo "Found '$url'!";
else: echo "Can't find '$url'.";
endif;
if (@file_get_contents($not_url)): echo "Found '$not_url!";
else: echo "Can't find '$not_url'.";
endif;

// Found 'http://google.com'!Can't find 'stp://google.com'.

1646941451 670 Wie kann ich per PHP prufen ob eine URL
Leela

function URLIsValid($URL)
{
    $exists = true;
    $file_headers = @get_headers($URL);
    $InvalidHeaders = array('404', '403', '500');
    foreach($InvalidHeaders as $HeaderVal)
    {
            if(strstr($file_headers[0], $HeaderVal))
            {
                    $exists = false;
                    break;
            }
    }
    return $exists;
}

  • Das PHP-Handbuch rät von der Verwendung ab strstr() um die Existenz einer Teilzeichenfolge zu überprüfen — es ermutigt zur Verwendung von strpos().

    – mickmackusa

    6. März 2021 um 3:49 Uhr

988830cookie-checkWie kann ich per PHP prüfen, ob eine URL existiert?

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

Privacy policy