Проверка, является ли URL мертвым или перенаправляет, не всегда работает - PullRequest
0 голосов
/ 22 мая 2019

Итак, я бегу по списку URL-адресов, чтобы проверить, не устарели ли они или не перенаправлены, а затем регистрирую результаты. У меня также есть некоторые исключения, чтобы пометить домены, которые перенаправляют в такие места, как godaddy.com или hugedomains.com, как мертвые, какими они в основном являются.

Моя проблема в том, что она пятнистая. Например, домены

  • custommarbleproducts.com
  • danielharderandsons.com

Перенаправление на эти:

Я пытаюсь отфильтровать "? Reqp = 1 & reqr =", и это работает иногда. Я могу запустить скрипт и из десяти мертвых / перенаправленных URL-адресов четыре будут помечены как мертвые, а затем повторно запущены и будут иметь три или пять помеченных как мертвые (и, если результаты будут другими, один последний раз помеченный как мертвый в этот раз может и не быть в этот раз) Я ищу более последовательные результаты. Вот функции:

function get_url_status($url) {

$cookie = realpath(dirname(__FILE__)) . "/cookie.txt";

file_put_contents($cookie, "");

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, 1);
if ($curl = curl_init()) {
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // follow redirects
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // set referer on redirect
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0');
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $final_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

    curl_close($ch);

    if ((strpos($final_url, "hugedomains.com") !== FALSE) ||
            (strpos($final_url, "namecheap.com") !== FALSE) ||
            (strpos($final_url, "uniregistry.com") !== FALSE) ||
            (strpos($final_url, "afternic.com") !== FALSE) ||
            (strpos($final_url, "buydomains.com") !== FALSE) ||
            (strpos($final_url, "/?nr=0") !== FALSE) ||
            (strpos($final_url, "?reqp=1&reqr=") !== FALSE) ||
            (strpos($final_url, "godaddy.com") !== FALSE)) {
        return 'dead';
    }

    if (in_array($http_code, array('404', '403', '500', '0'))) {
        return 'dead';
    } elseif (($http_code == 200) || ($url == $final_url)) {
        return 'ok';
    } elseif ($http_code > 300 || $http_code < 400) {
        return $final_url;
    } else {
        return '';
    }
  }
}

function quote_string($string) {
  $string = str_replace('"', "'", $string);
  $string = str_replace('&amp;', '&', $string);
  $string = str_replace('&nbsp;', ' ', $string);
  $string = preg_replace('!\s+!', ' ', $string);
  return '"' . trim($string) . '"';
}

У кого-нибудь есть идеи, чтобы сделать это более надежным?

1 Ответ

1 голос
/ 22 мая 2019

Возможно, сравните домены исходного и окончательного URL:

$orig_host = parse_url($url, PHP_URL_HOST);
$final_host = parse_url($final_url, PHP_URL_HOST);

$len = strlen($orig_host);

if (substr($final_host, 0 - $len) === $orig_host) {
    echo "$final_host ends with $orig_host";
}

}

...