2016-04-20 22 views
0

Ich bin derzeit die folgende Methode zu überprüfen, ob eine URLüberprüfen, ob URL existiert php

$url = 'https://www.facebook.com/a-test-example-232397848665383511'; 
$headers = @get_headers($url); 
if(strpos($headers[0],'200')===false){ 
    print('NOT found!'); 
} else { 
    print('found!'); 
} 

Dies besteht druckt NOT found! obwohl die Seite deutlich, wenn besucht löst. Ich drucke die Header und fand es, weil es eine 302 zurückgibt. Gibt es eine Möglichkeit, eine strpos zu tun, um für alle möglichen Header-Werte zu testen, die auflösen?

Stromausgang von Headern:

Array 
(
    [0] => HTTP/1.1 302 Found 
    [1] => Location: https://www.facebook.com/unsupportedbrowser 
    [2] => Vary: Accept-Encoding 
    [3] => Content-Type: text/html 
    // more array items 

Wenn ich in einer URL eingeben, die ich weiß, fehlschlägt ich folgendes erhalten:

Array 
(
    [0] => HTTP/1.1 404 Not Found 
    [1] => P3P: CP="Facebook does not have a P3P policy." 
    [2] => Strict-Transport-Security: max-age=15552000; preload 
    // rest of array 

Ist es sicher zu testen, einfach für einen 404?

+0

Ja, Sie können zwei 'strpos'-Prüfungen mit einer '||' oder-Bedingung verwenden, um die' if'-Prüfung stumpfer zu machen. Oder verwende eine Regex. – mario

+0

verwenden Sie Curl? – AlwaysConfused

Antwort

6

Ich würde cURL für die Überprüfung der URL verwenden. Ein beispielhaftes Verfahren wäre als

public function urlExists($url) { 

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

     $response = curl_exec($handle); 
     $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); 

     if($httpCode >= 200 && $httpCode <= 400) { 
      return true; 
     } else { 
      return false; 
     } 

     curl_close($handle); 
    } 
+3

Ich denke, Sie möchten $ httpCode <400, nicht $ httpCode <= 400. –

1

Server folgt mit verschiedenen Statuscodes reagieren können wie in RFC 2616 Für Sie Aufgabe, alle Codes 2xx und 3xx bedeuten Erfolg beschrieben.

Leistungshinweis: get_headers verwendet standardmäßig die GET-Methode, aber wenn Sie nicht am Seiteninhalt interessiert sind, ist es besser und schneller, die HEAD-Methode zu verwenden.

stream_context_set_default(
    array(
     'http' => array(
      'method' => 'HEAD' 
    ) 
) 
); 
$headers = @get_headers($url); 
$status = substr($headers[0], 9, 3); 
if ($status >= 200 && $status < 400) { 
    print('found!'); 
} else { 
    print('NOT found!'); 
} 
Verwandte Themen