get_headers Incoerenza

Esecuzione del seguente codice

var_dump(get_headers("http://www.domainnnnnnnnnnnnnnnnnnnnnnnnnnnn.com/CraxyFile.jpg")); 

Restituisce HTTP 200 anziché 404 per qualsiasi dominio o URL che non esiste

 Array ( [0] => HTTP/1.1 200 OK [1] => Server: nginx/1.1.15 [2] => Date: Mon, 08 Oct 2012 12:29:13 GMT [3] => Content-Type: text/html; charset=utf-8 [4] => Connection: close [5] => Set-Cookie: PHPSESSID=3iucojet7bt2peub72rgo0iu21; path=/; HttpOnly [6] => Expires: Thu, 19 Nov 1981 08:52:00 GMT [7] => Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 [8] => Pragma: no-cache [9] => Set-Cookie: bypassStaticCache=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; httponly [10] => Set-Cookie: bypassStaticCache=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; httponly [11] => Vary: Accept ) 

Se corri

 var_dump(get_headers("http://www.domain.com/CraxyFile.jpg")); 

Ottieni

 Array ( [0] => HTTP/1.1 404 Not Found [1] => Date: Mon, 08 Oct 2012 12:32:18 GMT [2] => Content-Type: text/html [3] => Content-Length: 8727 [4] => Connection: close [5] => Server: Apache [6] => Vary: Accept-Encoding ) 

Sono tanti i casi in cui get_headers ha dimostrato di essere una soluzione per validationre l'URL esistente

  • Qual è il modo migliore per verificare se esiste un URL in PHP?
  • Come posso verificare se esiste un URL tramite PHP?

Questo è un bug o get_headers non è un modo affidabile per validationre l'URL

Guarda la demo live

AGGIORNAMENTO 1

Devo scoprire che anche CURL ha lo stesso problema

 $curl = curl_init(); curl_setopt_arrays($curl, arrays(CURLOPT_RETURNTRANSFER => true,CURLOPT_URL => 'idontexist.tld')); curl_exec($curl); $info = curl_getinfo($curl); curl_close($curl); var_dump($info); 

Restituisce anche lo stesso risultato

Il problema non ha nulla a che fare con la lunghezza del nome di dominio, è semplicemente se il dominio esiste.

Stai utilizzando un servizio DNS che risolve domini inesistenti su un server che ti dà una pagina di errore "amichevole", che restituisce con un codice di risposta di 200. Questo significa che non è un problema con get_headers() particolare, si tratta di qualsiasi procedura con un affidamento di base su ricerche DNS sensate.

Un modo per gestire questo senza un hardcoding è una soluzione per each ambiente in cui lavori potrebbe assomigliare a questo:

 // A domain that definitely does not exist. The easiest way to guarantee that // this continues to work is to use an illegal top-level domain (TLD) suffix $testDomain = 'idontexist.tld'; // If this resolves to an IP, we know that we are behind a service such as this // We can simply compare the actual domain we test with the result of this $badIP = gethostbyname($testDomain); // Then when you want to get_headers() $url = 'http://www.domainnnnnnnnnnnnnnnnnnnnnnnnnnnn.com/CraxyFile.jpg'; $host = parse_url($url, PHP_URL_HOST); if (gethostbyname($host) === $badIP) { // The domain does not exist - probably handle this as if it were a 404 } else { // do the actual get_headers() stuff here } 

Potresti voler memorizzare in qualche modo il valore restituito della prima chiamata a gethostbyname() , dato che sai che stai cercando un nome che non esiste, e questo può spesso richiedere alcuni secondi.