Bagaimana saya bisa memeriksa apakah URL ada melalui PHP?

Jawaban:

296

Sini:

$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;
}

Dari sini dan tepat di bawah pos di atas, ada solusi keriting :

function url_exists($url) {
    if (!$fp = curl_init($url)) return false;
    return true;
}
karim79
sumber
18
Saya khawatir cara CURL tidak akan bekerja seperti ini. Lihat ini: stackoverflow.com/questions/981954/…
viam0Zah
4
beberapa situs web memiliki perbedaan $file_headers[0]pada halaman kesalahan. misalnya, youtube.com. halaman kesalahannya memiliki nilai tersebut sebagai HTTP/1.0 404 Not Found(selisih adalah 1.0 dan 1.1). lalu apa yang harus dilakukan?
Krishna Raj K
21
Mungkin menggunakan strpos($headers[0], '404 Not Found')mungkin melakukan trik
alexandru.topliceanu
12
@ Mark setuju! Untuk memperjelas, strpos($headers[0], '404')lebih baik!
alexandru.topliceanu
1
@ karim79 hati-hati dari serangan SSRF dan XSPA
M Rostami
55

Ketika mencari tahu apakah ada url dari php ada beberapa hal yang perlu diperhatikan:

  • Apakah url itu sendiri valid (string, tidak kosong, sintaks yang baik), ini cepat untuk memeriksa sisi server.
  • Menunggu respons mungkin membutuhkan waktu dan memblokir eksekusi kode.
  • Tidak semua header yang dikembalikan oleh get_headers () terbentuk dengan baik.
  • Gunakan ikal (jika Anda bisa).
  • Cegah mengambil seluruh tubuh / konten, tetapi hanya minta tajuk.
  • Pertimbangkan untuk mengalihkan url:
    • Apakah Anda ingin kode pertama dikembalikan?
    • Atau ikuti semua arahan ulang dan kembalikan kode terakhir?
    • Anda mungkin berakhir dengan angka 200, tetapi itu bisa mengarahkan ulang menggunakan meta tag atau javascript. Mencari tahu apa yang terjadi setelah itu sulit.

Perlu diingat bahwa metode apa pun yang Anda gunakan, perlu waktu untuk menunggu respons.
Semua kode mungkin (dan mungkin akan) berhenti sampai Anda tahu hasilnya atau permintaan telah habis.

Misalnya: kode di bawah ini bisa memakan waktu PANJANG untuk menampilkan halaman jika url tidak valid atau tidak dapat dijangkau:

<?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/>";
}

Fungsi-fungsi di bawah ini dapat membantu, Anda mungkin ingin memodifikasinya sesuai dengan kebutuhan Anda:

    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;
    }
MoonLite
sumber
untuk beberapa alasan getHttpResponseCode_using_curl () selalu mengembalikan 200 dalam kasus saya.
TD_Nijboer
2
jika seseorang memiliki masalah yang sama, periksa dns-nameserver .. gunakan opendn tanpa followredirects stackoverflow.com/a/11072947/1829460
TD_Nijboer
+1 sebagai satu-satunya jawaban untuk berurusan dengan arahan ulang. Mengubah return $codeuntuk if($code == 200){return true;} return false;memilah-satunya keberhasilan
Birrel
@PKHunter: Tidak. Regex preg_match cepat saya adalah contoh sederhana dan tidak akan cocok dengan semua url yang tercantum di sana. Lihat url tes ini: regex101.com/r/EpyDDc/2 Jika Anda menginginkan yang lebih baik, ganti dengan yang tercantum di tautan Anda ( mathiasbynens.be/demo/url-regex ) dari diegoperini; tampaknya cocok dengan mereka semua, lihat testlink ini: regex101.com/r/qMQp23/1
MoonLite
46
$headers = @get_headers($this->_value);
if(strpos($headers[0],'200')===false)return false;

jadi kapan saja Anda menghubungi situs web dan mendapatkan sesuatu yang lain dari 200 ok itu akan berhasil

lunarnet76
sumber
13
Tetapi bagaimana jika itu redirect? Domain ini masih valid, tetapi akan ditinggalkan.
Eric Leroy
4
Di atas pada satu baris: return strpos(@get_headers($url)[0],'200') === false ? false : true. Mungkin bermanfaat.
Dejv
$ this is in PHP adalah referensi ke objek saat ini. Referensi: php.net/manual/en/language.oop5.basic.php Primer: phpro.org/tutorials/Object-Oriented-Programming-with-PHP.html Kemungkinan besar cuplikan kode diambil dari kelas dan tidak diperbaiki sesuai dengan itu .
Marc Witteveen
18

Anda tidak dapat menggunakan ikal di server tertentu Anda dapat menggunakan kode ini

<?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';
  }
?>
Minhaz
sumber
mungkin tidak berfungsi untuk redirect 302-303 atau misalnya 304 Not Modified
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'.
Randy Skretka
sumber
2
Ini tidak akan berfungsi jika allow-url-fopen dimatikan. - php.net/manual/en/…
Daniel Paul Searles
2
Saya sarankan membaca hanya byte pertama ... 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;
}
leela
sumber
8

Saya menggunakan fungsi ini:

/**
 * @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";
    }
}
Ehsan
sumber
5

solusi get_headers () karim79 tidak bekerja untuk saya karena saya mendapatkan hasil yang gila-gilaan dengan Pinterest.

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] => 
) 

Bagaimanapun, pengembang ini menunjukkan bahwa cURL jauh lebih cepat daripada get_headers ():

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

Karena banyak orang yang meminta karim79 untuk memperbaikinya adalah solusi CURL, inilah solusi yang saya buat hari ini.

/**
* 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;
}

Biarkan saya menjelaskan opsi ikal:

CURLOPT_RETURNTRANSFER : kembalikan string alih-alih menampilkan halaman panggilan di layar.

CURLOPT_SSL_VERIFYPEER : cUrl tidak akan membatalkan sertifikat

CURLOPT_HEADER : sertakan header dalam string

CURLOPT_NOBODY : jangan sertakan isi dalam string

CURLOPT_USERAGENT : beberapa situs membutuhkan itu berfungsi dengan baik (misalnya: https://plus.google.com )


Catatan tambahan : Dalam fungsi ini saya menggunakan regex Diego Perini untuk memvalidasi URL sebelum mengirim permintaan:

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

Catatan tambahan 2 : Saya meledakkan string header dan header pengguna [0] untuk memastikan hanya memvalidasi hanya kode dan pesan yang dikembalikan (contoh: 200, 404, 405, dll.)

Catatan tambahan 3 : Kadang memvalidasi hanya kode 404 tidak cukup (lihat tes unit), jadi ada parameter opsional $ failCodeList untuk memasok semua daftar kode untuk ditolak.

Dan, tentu saja, inilah tes unit (termasuk semua jaringan sosial populer) untuk melegitimasi pengkodean saya:

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"));
}

Sukses besar untuk semua,

Jonathan Parent-Lévesque dari Montreal

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

cukup cepat:

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');
Sebastian Lasse
sumber
Terlalu rumit :) stackoverflow.com/questions/981954/…
Ja͢ck
saya mendapatkan exceptionn ini ketika url ada: Tidak dapat memanggil CURLOPT_HEADERFUNCTION
safiot
3

Semua solusi di atas + gula tambahan. (Solusi Ultimate AIO)

/**
 * 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');
}

Contoh:

var_dump ( urlExists('http://stackoverflow.com/') );
// Output: true;
Junaid Atari
sumber
3

untuk memeriksa apakah url online atau offline ---

function get_http_response_code($theURL) {
    $headers = @get_headers($theURL);
    return substr($headers[0], 9, 3);
}
Hosam Elzagh
sumber
3
function url_exists($url) {
    $headers = @get_headers($url);
    return (strpos($headers[0],'200')===false)? false:true;
}
Krishna Guragai
sumber
2

Ini adalah solusi yang hanya membaca byte pertama kode sumber ... mengembalikan false jika file_get_contents gagal ... Ini juga akan berfungsi untuk file jarak jauh seperti gambar.

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

cara sederhananya adalah ikal (dan LEBIH CEPAT)

<?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';}

?>
T.Todua
sumber
0

Cara lain untuk memeriksa apakah URL valid atau tidak bisa:

<?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;
      }
  }
?>
Antonio Carlos Barbosa
sumber
0

get_headers () mengembalikan array dengan header yang dikirim oleh server sebagai tanggapan terhadap permintaan HTTP.

$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>';
}
Jeacovy Gayle
sumber
0

cURL dapat mengembalikan kode HTTP Saya rasa semua kode tambahan itu tidak perlu?

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;
        }
    }
Arun Vitto
sumber
0

Satu hal yang perlu dipertimbangkan ketika Anda memeriksa header untuk 404 adalah kasus di mana sebuah situs tidak menghasilkan 404 segera.

Banyak situs memeriksa apakah halaman ada atau tidak dalam sumber PHP / ASP (dan lain-lain) dan meneruskan Anda ke halaman 404. Dalam kasus tersebut header pada dasarnya diperpanjang oleh header 404 yang dihasilkan. Dalam kasus-kasus itu kesalahan 404 bukan di baris pertama dari header, tetapi kesepuluh.

$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 
) 
Lexib0y
sumber
0

Saya menjalankan beberapa tes untuk melihat apakah tautan di situs saya valid - beri tahu saya ketika pihak ketiga mengubah tautannya. Saya mengalami masalah dengan situs yang memiliki sertifikat yang dikonfigurasi dengan buruk yang berarti get_headers php tidak berfungsi.

JADI, saya membaca ikal yang lebih cepat dan memutuskan untuk mencobanya. kemudian saya punya masalah dengan linkedin yang memberi saya kesalahan 999, yang ternyata menjadi masalah agen pengguna.

Saya tidak peduli jika sertifikatnya tidak valid untuk tes ini, dan saya tidak peduli jika jawabannya langsung.

Kemudian saya pikir menggunakan get_headers jika ikal gagal ....

Mencobanya....

/**
 * 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;
}
pgee70
sumber
-2

semacam utas lama, tapi .. saya melakukan ini:

$file = 'http://www.google.com';
$file_headers = @get_headers($file);
if ($file_headers) {
    $exists = true;
} else {
    $exists = false;
}
hackdotslashdotkill
sumber
Agak .. Tapi tidak persis.
hackdotslashdotkill
bagaimana jawaban Anda lebih baik?
Jah
@Jah itu jelas bukan di -2. Saya mungkin memposting selarut ini suatu malam ketika saya setengah tertidur setelah menatap layar sepanjang hari ..
hackdotslashdotkill