4

次のコードを実行する

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

存在しないドメインまたはURLの場合、404ではなくHTTP200を返します

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を検証するためのソリューションであることが証明されている非常に多くのインスタンスです

これはバグですか、それとも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);

また、同じ結果を返します

4

1 に答える 1

11

問題はドメイン名の長さとは関係がなく、単にドメインが存在するかどうかです。

存在しないドメインをサーバーに解決する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()存在しない名前を検索していることがわかっているため、への最初の呼び出しの戻り値を何らかの方法でキャッシュすることをお勧めします。これには数秒かかることがよくあります。

于 2012-10-08T13:02:33.313 に答える