get_headers Несоответствие
Выполнение следующего кода
var_dump(get_headers("http://www.domainnnnnnnnnnnnnnnnnnnnnnnnnnnn.com/CraxyFile.jpg"));
Возвращает HTTP 200 вместо 404 для любого домена или URL, который не существует
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
)
Если вы бежите
var_dump(get_headers("http://www.domain.com/CraxyFile.jpg"));
Ты получаешь
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
)
Они так много случаев, когда get_headers
было доказано, что это решение для проверки существующих URL
- Каков наилучший способ проверить, существует ли URL в PHP?
- Как я могу проверить, существует ли URL через PHP?
Это ошибка или get_headers не является надежным способом проверки URL
ОБНОВЛЕНИЕ 1
Нужно выяснить, что CURL также имеет ту же проблему
$curl = curl_init();
curl_setopt_array($curl, array(CURLOPT_RETURNTRANSFER => true,CURLOPT_URL => 'idontexist.tld'));
curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);
var_dump($info);
1 ответ
Проблема не в том, что длина доменного имени, а в том, существует ли домен.
Вы используете службу DNS, которая разрешает несуществующие домены на сервер, который выдает "дружественную" страницу ошибки, которую он возвращает с кодом ответа 200. Это означает, что это также не проблема с get_headers()
в частности, это любая процедура, основанная на разумном поиске DNS.
Способ справиться с этим без жесткого обхода для каждой среды, в которой вы работаете, может выглядеть примерно так:
// 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
}
Вы можете захотеть как-то кэшировать возвращаемое значение первого вызова gethostbyname()
, поскольку вы знаете, что ищете имя, которое не существует, и это часто может занять несколько секунд.