PHP üzerinden bir URL olup olmadığını nasıl kontrol edebilirim?


Yanıtlar:


296

Buraya:

$file = 'http://www.domain.com/somefile.jpg';
$file_headers = @get_headers($file);
if(!$file_headers || $file_headers[0] == 'HTTP/1.1 404 Not Found') {
    $exists = false;
}
else {
    $exists = true;
}

Gönderen burada ve hemen altında yukarıdaki yazı, bir var bukle çözümü:

function url_exists($url) {
    if (!$fp = curl_init($url)) return false;
    return true;
}

18
Korkarım CURL-yolu bu şekilde çalışmaz.
Şuna bir

4
bazı web sitelerinde $file_headers[0]hata sayfası farklıdır . örneğin, youtube.com. hata sayfası bu değere sahiptir HTTP/1.0 404 Not Found(fark 1.0 ve 1.1'dir). o zaman ne yapmalı?
Krishna Raj K

21
Belki kullanarak strpos($headers[0], '404 Not Found')hile yapabilir
alexandru.topliceanu

12
@ Mark kabul etti! Açıklığa kavuşturmak strpos($headers[0], '404')daha iyidir!
alexandru.topliceanu

1
@ karim79 SSRF ve XSPA saldırılarına karşı dikkatli olun
M Rostami

55

Php bir url varsa bulmak zaman dikkat edilmesi gereken birkaç şey vardır:

  • URL'nin kendisi geçerli mi (bir dize, boş değil, iyi bir sözdizimi), bu sunucu tarafını kontrol etmek hızlıdır.
  • Yanıt beklemek zaman alabilir ve kod yürütülmesini engelleyebilir.
  • Get_headers () tarafından döndürülen tüm başlıklar düzgün biçimlendirilmemiş.
  • Kıvrılma kullanın (mümkünse).
  • Tüm gövdeyi / içeriği getirmeyi önleyin, ancak yalnızca üstbilgileri isteyin.
  • URL'leri yeniden yönlendirmeyi düşünün:
    • İlk kodun döndürülmesini istiyor musunuz?
    • Veya tüm yönlendirmeleri takip edip son kodu döndürmek?
    • Sonunda 200 olabilir, ancak meta etiketler veya javascript kullanarak yönlendirme yapabilir. Sonra ne olacağını bulmak zor.

Hangi yöntemi kullanırsanız kullanın, yanıt beklemenin zaman aldığını unutmayın.
Sonucu öğreninceye veya istekler zaman aşımına uğrayana kadar tüm kodlar durdurulabilir (ve büyük olasılıkla).

Örneğin: aşağıdaki kod, URL'ler geçersiz veya erişilemiyorsa sayfayı görüntülemek için UZUN zaman alabilir:

<?php
$urls = getUrls(); // some function getting say 10 or more external links

foreach($urls as $k=>$url){
  // this could potentially take 0-30 seconds each
  // (more or less depending on connection, target site, timeout settings...)
  if( ! isValidUrl($url) ){
    unset($urls[$k]);
  }
}

echo "yay all done! now show my site";
foreach($urls as $url){
  echo "<a href=\"{$url}\">{$url}</a><br/>";
}

Aşağıdaki işlevler yardımcı olabilir, muhtemelen bunları ihtiyaçlarınıza göre değiştirmek istersiniz:

    function isValidUrl($url){
        // first do some quick sanity checks:
        if(!$url || !is_string($url)){
            return false;
        }
        // quick check url is roughly a valid http request: ( http://blah/... ) 
        if( ! preg_match('/^http(s)?:\/\/[a-z0-9-]+(\.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $url) ){
            return false;
        }
        // the next bit could be slow:
        if(getHttpResponseCode_using_curl($url) != 200){
//      if(getHttpResponseCode_using_getheaders($url) != 200){  // use this one if you cant use curl
            return false;
        }
        // all good!
        return true;
    }

    function getHttpResponseCode_using_curl($url, $followredirects = true){
        // returns int responsecode, or false (if url does not exist or connection timeout occurs)
        // NOTE: could potentially take up to 0-30 seconds , blocking further code execution (more or less depending on connection, target site, and local timeout settings))
        // if $followredirects == false: return the FIRST known httpcode (ignore redirects)
        // if $followredirects == true : return the LAST  known httpcode (when redirected)
        if(! $url || ! is_string($url)){
            return false;
        }
        $ch = @curl_init($url);
        if($ch === false){
            return false;
        }
        @curl_setopt($ch, CURLOPT_HEADER         ,true);    // we want headers
        @curl_setopt($ch, CURLOPT_NOBODY         ,true);    // dont need body
        @curl_setopt($ch, CURLOPT_RETURNTRANSFER ,true);    // catch output (do NOT print!)
        if($followredirects){
            @curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,true);
            @curl_setopt($ch, CURLOPT_MAXREDIRS      ,10);  // fairly random number, but could prevent unwanted endless redirects with followlocation=true
        }else{
            @curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,false);
        }
//      @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,5);   // fairly random number (seconds)... but could prevent waiting forever to get a result
//      @curl_setopt($ch, CURLOPT_TIMEOUT        ,6);   // fairly random number (seconds)... but could prevent waiting forever to get a result
//      @curl_setopt($ch, CURLOPT_USERAGENT      ,"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1");   // pretend we're a regular browser
        @curl_exec($ch);
        if(@curl_errno($ch)){   // should be 0
            @curl_close($ch);
            return false;
        }
        $code = @curl_getinfo($ch, CURLINFO_HTTP_CODE); // note: php.net documentation shows this returns a string, but really it returns an int
        @curl_close($ch);
        return $code;
    }

    function getHttpResponseCode_using_getheaders($url, $followredirects = true){
        // returns string responsecode, or false if no responsecode found in headers (or url does not exist)
        // NOTE: could potentially take up to 0-30 seconds , blocking further code execution (more or less depending on connection, target site, and local timeout settings))
        // if $followredirects == false: return the FIRST known httpcode (ignore redirects)
        // if $followredirects == true : return the LAST  known httpcode (when redirected)
        if(! $url || ! is_string($url)){
            return false;
        }
        $headers = @get_headers($url);
        if($headers && is_array($headers)){
            if($followredirects){
                // we want the the last errorcode, reverse array so we start at the end:
                $headers = array_reverse($headers);
            }
            foreach($headers as $hline){
                // search for things like "HTTP/1.1 200 OK" , "HTTP/1.0 200 OK" , "HTTP/1.1 301 PERMANENTLY MOVED" , "HTTP/1.1 400 Not Found" , etc.
                // note that the exact syntax/version/output differs, so there is some string magic involved here
                if(preg_match('/^HTTP\/\S+\s+([1-9][0-9][0-9])\s+.*/', $hline, $matches) ){// "HTTP/*** ### ***"
                    $code = $matches[1];
                    return $code;
                }
            }
            // no HTTP/xxx found in headers:
            return false;
        }
        // no headers :
        return false;
    }

nedense getHttpResponseCode_using_curl () her zaman benim durumumda 200 döndürür.
TD_Nijboer

2
Birisi aynı sorunu yaşıyorsa, dns-ad sunucularını kontrol edin .. takip eden yönlendirmeleri olmayan açıkları kullanın stackoverflow.com/a/11072947/1829460
TD_Nijboer

Yönlendirmelerle ilgilenen tek yanıt olduğu için +1. Sadece başarıları sıralamak return $codeiçin değiştirildiif($code == 200){return true;} return false;
Birrel

@PKHunter: Hayır. Hızlı preg_match normal ifadem basit bir örnektir ve burada listelenen tüm URL'lerle eşleşmez. Bu test url'sine bakın: regex101.com/r/EpyDDc/2 Daha iyi bir tane istiyorsanız, diegoperini'den bağlantınızda listelenen ( mathiasbynens.be/demo/url-regex ) ile değiştirin; hepsiyle eşleşiyor gibi görünüyor, şu test bağlantısına bakın: regex101.com/r/qMQp23/1
MoonLite

46
$headers = @get_headers($this->_value);
if(strpos($headers[0],'200')===false)return false;

Bu yüzden bir web sitesine başvurduğunuzda ve 200'den fazla bir şey aldığınızda işe yarayacak


13
Ama ya bir yönlendirme olursa? Alan adı hala geçerli, ancak hariç bırakılacak.
Eric Leroy

4
Tek satıra Yukarıda: return strpos(@get_headers($url)[0],'200') === false ? false : true. Yararlı olabilir.
Dejv

$ PHP bu geçerli nesneye bir referanstır. Referans: php.net/manual/en/language.oop5.basic.php Astar: phpro.org/tutorials/Object-Oriented-Programming-with-PHP.html Büyük olasılıkla kod snippet'i bir sınıftan alınmış ve buna göre düzeltilmemiş .
Marc Witteveen

18

bazı sunucularda curl kullanamazsınız u bu kodu kullanabilirsiniz

<?php
$url = 'http://www.example.com';
$array = get_headers($url);
$string = $array[0];
if(strpos($string,"200"))
  {
    echo 'url exists';
  }
  else
  {
    echo 'url does not exist';
  }
?>

302-303 yönlendirmesi için çalışmayabilir veya örneğin 304 Değiştirilmedi
Zippp

8
$url = 'http://google.com';
$not_url = 'stp://google.com';

if (@file_get_contents($url)): echo "Found '$url'!";
else: echo "Can't find '$url'.";
endif;
if (@file_get_contents($not_url)): echo "Found '$not_url!";
else: echo "Can't find '$not_url'.";
endif;

// Found 'http://google.com'!Can't find 'stp://google.com'.

2
Allow-url-fopen kapalıysa bu çalışmaz. - php.net/manual/en/…
Daniel Paul Searles

2
Sadece ilk baytı okumayı öneririm ... if (@file_get_contents ($ url, false, NULL, 0,1))
Daniel Valland

8
function URLIsValid($URL)
{
    $exists = true;
    $file_headers = @get_headers($URL);
    $InvalidHeaders = array('404', '403', '500');
    foreach($InvalidHeaders as $HeaderVal)
    {
            if(strstr($file_headers[0], $HeaderVal))
            {
                    $exists = false;
                    break;
            }
    }
    return $exists;
}

8

Bu işlevi kullanıyorum:

/**
 * @param $url
 * @param array $options
 * @return string
 * @throws Exception
 */
function checkURL($url, array $options = array()) {
    if (empty($url)) {
        throw new Exception('URL is empty');
    }

    // list of HTTP status codes
    $httpStatusCodes = array(
        100 => 'Continue',
        101 => 'Switching Protocols',
        102 => 'Processing',
        200 => 'OK',
        201 => 'Created',
        202 => 'Accepted',
        203 => 'Non-Authoritative Information',
        204 => 'No Content',
        205 => 'Reset Content',
        206 => 'Partial Content',
        207 => 'Multi-Status',
        208 => 'Already Reported',
        226 => 'IM Used',
        300 => 'Multiple Choices',
        301 => 'Moved Permanently',
        302 => 'Found',
        303 => 'See Other',
        304 => 'Not Modified',
        305 => 'Use Proxy',
        306 => 'Switch Proxy',
        307 => 'Temporary Redirect',
        308 => 'Permanent Redirect',
        400 => 'Bad Request',
        401 => 'Unauthorized',
        402 => 'Payment Required',
        403 => 'Forbidden',
        404 => 'Not Found',
        405 => 'Method Not Allowed',
        406 => 'Not Acceptable',
        407 => 'Proxy Authentication Required',
        408 => 'Request Timeout',
        409 => 'Conflict',
        410 => 'Gone',
        411 => 'Length Required',
        412 => 'Precondition Failed',
        413 => 'Payload Too Large',
        414 => 'Request-URI Too Long',
        415 => 'Unsupported Media Type',
        416 => 'Requested Range Not Satisfiable',
        417 => 'Expectation Failed',
        418 => 'I\'m a teapot',
        422 => 'Unprocessable Entity',
        423 => 'Locked',
        424 => 'Failed Dependency',
        425 => 'Unordered Collection',
        426 => 'Upgrade Required',
        428 => 'Precondition Required',
        429 => 'Too Many Requests',
        431 => 'Request Header Fields Too Large',
        449 => 'Retry With',
        450 => 'Blocked by Windows Parental Controls',
        500 => 'Internal Server Error',
        501 => 'Not Implemented',
        502 => 'Bad Gateway',
        503 => 'Service Unavailable',
        504 => 'Gateway Timeout',
        505 => 'HTTP Version Not Supported',
        506 => 'Variant Also Negotiates',
        507 => 'Insufficient Storage',
        508 => 'Loop Detected',
        509 => 'Bandwidth Limit Exceeded',
        510 => 'Not Extended',
        511 => 'Network Authentication Required',
        599 => 'Network Connect Timeout Error'
    );

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    if (isset($options['timeout'])) {
        $timeout = (int) $options['timeout'];
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    }

    curl_exec($ch);
    $returnedStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if (array_key_exists($returnedStatusCode, $httpStatusCodes)) {
        return "URL: '{$url}' - Error code: {$returnedStatusCode} - Definition: {$httpStatusCodes[$returnedStatusCode]}";
    } else {
        return "'{$url}' does not exist";
    }
}

5

Pinterest ile çılgın sonuçlar aldığım için karim79'un get_headers () çözümü benim için çalışmadı.

get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Array
(
    [url] => https://www.pinterest.com/jonathan_parl/
    [exists] => 
)

get_headers(): Failed to enable crypto

Array
(
    [url] => https://www.pinterest.com/jonathan_parl/
    [exists] => 
)

get_headers(https://www.pinterest.com/jonathan_parl/): failed to open stream: operation failed

Array
(
    [url] => https://www.pinterest.com/jonathan_parl/
    [exists] => 
) 

Her neyse, bu geliştirici cURL'nin get_headers () yönteminden çok daha hızlı olduğunu gösteriyor:

http://php.net/manual/fr/function.get-headers.php#104723

Birçok insan karim79'un düzeltilmesini istediğinden cURL çözümü olduğundan, bugün oluşturduğum çözüm.

/**
* Send an HTTP request to a the $url and check the header posted back.
*
* @param $url String url to which we must send the request.
* @param $failCodeList Int array list of code for which the page is considered invalid.
*
* @return Boolean
*/
public static function isUrlExists($url, array $failCodeList = array(404)){

    $exists = false;

    if(!StringManager::stringStartWith($url, "http") and !StringManager::stringStartWith($url, "ftp")){

        $url = "https://" . $url;
    }

    if (preg_match(RegularExpression::URL, $url)){

        $handle = curl_init($url);


        curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($handle, CURLOPT_HEADER, true);

        curl_setopt($handle, CURLOPT_NOBODY, true);

        curl_setopt($handle, CURLOPT_USERAGENT, true);


        $headers = curl_exec($handle);

        curl_close($handle);


        if (empty($failCodeList) or !is_array($failCodeList)){

            $failCodeList = array(404); 
        }

        if (!empty($headers)){

            $exists = true;

            $headers = explode(PHP_EOL, $headers);

            foreach($failCodeList as $code){

                if (is_numeric($code) and strpos($headers[0], strval($code)) !== false){

                    $exists = false;

                    break;  
                }
            }
        }
    }

    return $exists;
}

Kıvrılma seçeneklerini açıklayayım:

CURLOPT_RETURNTRANSFER : çağıran sayfayı ekranda görüntülemek yerine bir dize döndürür.

CURLOPT_SSL_VERIFYPEER : cUrl sertifikayı teslim almaz

CURLOPT_HEADER : üstbilgiyi dizeye dahil et

CURLOPT_NOBODY : gövdeyi dizeye dahil etme

CURLOPT_USERAGENT : bazı sitelerin düzgün çalışması için buna ihtiyacı vardır (örneğin: https://plus.google.com )


Ek not : Bu işlevde, isteği göndermeden önce URL'yi doğrulamak için Diego Perini'nin normal ifadesini kullanıyorum:

const URL = "%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu"; //@copyright Diego Perini

Ek not 2 : Yalnızca dönüş kodunu ve mesajı doğruladığından emin olmak için başlık dizesini ve kullanıcı başlıklarını [0] patlattım (örnek: 200, 404, 405, vb.)

Ek not 3 : Bazen sadece 404 kodunu doğrulamak yeterli değildir (birim testine bakın), bu nedenle reddedilecek tüm kod listesini sağlamak için isteğe bağlı bir $ failCodeList parametresi vardır.

Ve elbette, kodlamamı meşrulaştırmak için birim test (tüm popüler sosyal ağ dahil):

public function testIsUrlExists(){

//invalid
$this->assertFalse(ToolManager::isUrlExists("woot"));

$this->assertFalse(ToolManager::isUrlExists("https://www.facebook.com/jonathan.parentlevesque4545646456"));

$this->assertFalse(ToolManager::isUrlExists("https://plus.google.com/+JonathanParentL%C3%A9vesque890800"));

$this->assertFalse(ToolManager::isUrlExists("https://instagram.com/mariloubiz1232132/", array(404, 405)));

$this->assertFalse(ToolManager::isUrlExists("https://www.pinterest.com/jonathan_parl1231/"));

$this->assertFalse(ToolManager::isUrlExists("https://regex101.com/546465465456"));

$this->assertFalse(ToolManager::isUrlExists("https://twitter.com/arcadefire4566546"));

$this->assertFalse(ToolManager::isUrlExists("https://vimeo.com/**($%?%$", array(400, 405)));

$this->assertFalse(ToolManager::isUrlExists("https://www.youtube.com/user/Darkjo666456456456"));


//valid
$this->assertTrue(ToolManager::isUrlExists("www.google.ca"));

$this->assertTrue(ToolManager::isUrlExists("https://www.facebook.com/jonathan.parentlevesque"));

$this->assertTrue(ToolManager::isUrlExists("https://plus.google.com/+JonathanParentL%C3%A9vesque"));

$this->assertTrue(ToolManager::isUrlExists("https://instagram.com/mariloubiz/"));

$this->assertTrue(ToolManager::isUrlExists("https://www.facebook.com/jonathan.parentlevesque"));

$this->assertTrue(ToolManager::isUrlExists("https://www.pinterest.com/"));

$this->assertTrue(ToolManager::isUrlExists("https://regex101.com"));

$this->assertTrue(ToolManager::isUrlExists("https://twitter.com/arcadefire"));

$this->assertTrue(ToolManager::isUrlExists("https://vimeo.com/"));

$this->assertTrue(ToolManager::isUrlExists("https://www.youtube.com/user/Darkjo666"));
}

Herkese büyük başarı,

Montreal'den Jonathan Parent-Lévesque


4
function urlIsOk($url)
{
    $headers = @get_headers($url);
    $httpStatus = intval(substr($headers[0], 9, 3));
    if ($httpStatus<400)
    {
        return true;
    }
    return false;
}

3

oldukça hızlı:

function http_response($url){
    $resURL = curl_init(); 
    curl_setopt($resURL, CURLOPT_URL, $url); 
    curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1); 
    curl_setopt($resURL, CURLOPT_HEADERFUNCTION, 'curlHeaderCallback'); 
    curl_setopt($resURL, CURLOPT_FAILONERROR, 1); 
    curl_exec ($resURL); 
    $intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE); 
    curl_close ($resURL); 
    if ($intReturnCode != 200 && $intReturnCode != 302 && $intReturnCode != 304) { return 0; } else return 1;
}

echo 'google:';
echo http_response('http://www.google.com');
echo '/ ogogle:';
echo http_response('http://www.ogogle.com');


url olduğunda bu istisna olsun: CURLOPT_HEADERFUNCTION
çağrılamadı

3

Yukarıdaki tüm çözeltiler + ekstra şeker. (Ultimate AIO çözümü)

/**
 * Check that given URL is valid and exists.
 * @param string $url URL to check
 * @return bool TRUE when valid | FALSE anyway
 */
function urlExists ( $url ) {
    // Remove all illegal characters from a url
    $url = filter_var($url, FILTER_SANITIZE_URL);

    // Validate URI
    if (filter_var($url, FILTER_VALIDATE_URL) === FALSE
        // check only for http/https schemes.
        || !in_array(strtolower(parse_url($url, PHP_URL_SCHEME)), ['http','https'], true )
    ) {
        return false;
    }

    // Check that URL exists
    $file_headers = @get_headers($url);
    return !(!$file_headers || $file_headers[0] === 'HTTP/1.1 404 Not Found');
}

Misal:

var_dump ( urlExists('http://stackoverflow.com/') );
// Output: true;

3

url'nin çevrimiçi veya çevrimdışı olup olmadığını kontrol etmek için ---

function get_http_response_code($theURL) {
    $headers = @get_headers($theURL);
    return substr($headers[0], 9, 3);
}

3
function url_exists($url) {
    $headers = @get_headers($url);
    return (strpos($headers[0],'200')===false)? false:true;
}

2

İşte kaynak kodun yalnızca ilk baytını okuyan bir çözüm ... file_get_contents başarısız olursa false döndürür ... Bu, görüntüler gibi uzak dosyalar için de çalışır.

 function urlExists($url)
{
    if (@file_get_contents($url,false,NULL,0,1))
    {
        return true;
    }
    return false;
}

0

basit yol kıvrılmadır (ve HIZLI da)

<?php
$mylinks="http://site.com/page.html";
$handlerr = curl_init($mylinks);
curl_setopt($handlerr,  CURLOPT_RETURNTRANSFER, TRUE);
$resp = curl_exec($handlerr);
$ht = curl_getinfo($handlerr, CURLINFO_HTTP_CODE);


if ($ht == '404')
     { echo 'OK';}
else { echo 'NO';}

?>

0

Bir URL'nin geçerli olup olmadığını kontrol etmenin diğer yolu şunlar olabilir:

<?php

  if (isValidURL("http://www.gimepix.com")) {
      echo "URL is valid...";
  } else {
      echo "URL is not valid...";
  }

  function isValidURL($url) {
      $file_headers = @get_headers($url);
      if (strpos($file_headers[0], "200 OK") > 0) {
         return true;
      } else {
        return false;
      }
  }
?>

0

get_headers () , HTTP isteğine yanıt olarak sunucu tarafından gönderilen başlıkların bulunduğu bir dizi döndürür.

$image_path = 'https://your-domain.com/assets/img/image.jpg';

$file_headers = @get_headers($image_path);
//Prints the response out in an array
//print_r($file_headers); 

if($file_headers[0] == 'HTTP/1.1 404 Not Found'){
   echo 'Failed because path does not exist.</br>';
}else{
   echo 'It works. Your good to go!</br>';
}

0

cURL HTTP kodu döndürebilir Tüm bu ekstra kod gerekli olduğunu sanmıyorum?

function urlExists($url=NULL)
    {
        if($url == NULL) return false;
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch); 
        if($httpcode>=200 && $httpcode<300){
            return true;
        } else {
            return false;
        }
    }

0

404 için başlığı kontrol ettiğinizde göz önünde bulundurulması gereken bir şey, bir sitenin hemen 404 üretmediği durumdur.

Birçok site PHP / ASP (et cetera) kaynağında bir sayfanın var olup olmadığını kontrol eder ve sizi bir 404 sayfasına yönlendirir. Bu durumlarda başlık temel olarak üretilen 404'ün başlığı tarafından uzatılır. Bu durumlarda, 404 hatası başlığın ilk satırında değil, onuncuda.

$array = get_headers($url);
$string = $array[0];
print_r($string) // would generate:

Array ( 
[0] => HTTP/1.0 301 Moved Permanently 
[1] => Date: Fri, 09 Nov 2018 16:12:29 GMT 
[2] => Server: Apache/2.4.34 (FreeBSD) LibreSSL/2.7.4 PHP/7.0.31 
[3] => X-Powered-By: PHP/7.0.31 
[4] => Set-Cookie: landing=%2Freed-diffuser-fig-pudding-50; path=/; HttpOnly 
[5] => Location: /reed-diffuser-fig-pudding-50/ 
[6] => Content-Length: 0 
[7] => Connection: close 
[8] => Content-Type: text/html; charset=utf-8 
[9] => HTTP/1.0 404 Not Found 
[10] => Date: Fri, 09 Nov 2018 16:12:29 GMT 
[11] => Server: Apache/2.4.34 (FreeBSD) LibreSSL/2.7.4 PHP/7.0.31 
[12] => X-Powered-By: PHP/7.0.31 
[13] => Set-Cookie: landing=%2Freed-diffuser-fig-pudding-50%2F; path=/; HttpOnly 
[14] => Connection: close 
[15] => Content-Type: text/html; charset=utf-8 
) 

0

Sitemdeki bağlantıların geçerli olup olmadığını görmek için bazı testler yapıyorum - üçüncü taraflar bağlantılarını değiştirdiğinde beni uyarıyor. Ben php get_headers işe yaramadı demek kötü yapılandırılmış bir sertifika vardı bir sitede bir sorun yaşıyordu.

Yani, bu kıvrımın daha hızlı olduğunu okudum ve bunu denemeye karar verdim. sonra bana bir kullanıcı aracısı sorunu olduğu ortaya çıktı 999 hatası verdi Linkedin ile ilgili bir sorun vardı.

Sertifikanın bu test için geçerli olup olmadığını umursamadım ve yanıtın yeniden doğrudan olup olmadığı umurumda değildi.

Sonra kıvırmak başarısız olursa yine de get_headers kullanımı düşündüm ....

Bir şans ver ....

/**
 * returns true/false if the $url is present.
 *
 * @param string $url assumes this is a valid url.
 *
 * @return bool
 */
private function url_exists (string $url): bool
{
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_NOBODY, TRUE);             // this does a head request to make it faster.
  curl_setopt($ch, CURLOPT_HEADER, TRUE);             // just the headers
  curl_setopt($ch, CURLOPT_SSL_VERIFYSTATUS, FALSE);  // turn off that pesky ssl stuff - some sys admins can't get it right.
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  // set a real user agent to stop linkedin getting upset.
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36');
  curl_exec($ch);
  $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  if (($http_code >= HTTP_OK && $http_code < HTTP_BAD_REQUEST) || $http_code === 999)
  {
    curl_close($ch);
    return TRUE;
  }
  $error = curl_error($ch); // used for debugging.
  curl_close($ch);
  // just try the get_headers - it might work!
  stream_context_set_default(array('http' => array('method' => 'HEAD')));
  $file_headers = @get_headers($url);
  if ($file_headers)
  {
    $response_code = substr($file_headers[0], 9, 3);
    return $response_code >= 200 && $response_code < 400;
  }
  return FALSE;
}

-2

eski bir iplik tür, ama .. ben bunu:

$file = 'http://www.google.com';
$file_headers = @get_headers($file);
if ($file_headers) {
    $exists = true;
} else {
    $exists = false;
}

Sorta .. Ama tam olarak değil.
hackdotslashdotkill

cevabın nasıl daha iyi?
Jah

Açıkçası -2 de değil. Muhtemelen bütün gece ekranlara
baktıktan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.