Làm cách nào để kiểm tra xem URL có tồn tại qua PHP không?


Câu trả lời:


296

Đây:

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

Từ đâyngay bên dưới bài viết trên, có một giải pháp curl :

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

18
Tôi e rằng cách CURL sẽ không hoạt động theo cách này. Hãy xem cái này: stackoverflow.com/questions/981954/
Khắc

4
một số trang web có sự khác biệt $file_headers[0]trên trang lỗi. ví dụ: youtube.com. trang lỗi của nó có giá trị đó là HTTP/1.0 404 Not Found(chênh lệch là 1.0 và 1.1). phải làm sao sau đó
Krishna Raj K

21
Có lẽ sử dụng strpos($headers[0], '404 Not Found')có thể thực hiện các mẹo
alexandru.topliceanu

12
@Mark đồng ý! Để làm rõ, strpos($headers[0], '404')là tốt hơn!
alexandru.topliceanu

1
@ karim79 được chăm sóc từ các cuộc tấn công SSRF và XSPA
M Rostami

55

Khi tìm hiểu xem một url có tồn tại từ php không, có một số điều cần chú ý:

  • Là chính url hợp lệ (một chuỗi, không trống, cú pháp tốt), điều này là nhanh chóng để kiểm tra phía máy chủ.
  • Chờ phản hồi có thể mất thời gian và thực thi mã khối.
  • Không phải tất cả các tiêu đề được trả về bởi get_headers () đều được hình thành.
  • Sử dụng curl (nếu bạn có thể).
  • Ngăn chặn toàn bộ nội dung / nội dung, nhưng chỉ yêu cầu các tiêu đề.
  • Xem xét chuyển hướng url:
    • Bạn có muốn mã đầu tiên được trả về?
    • Hoặc làm theo tất cả các chuyển hướng và trả lại mã cuối cùng?
    • Bạn có thể kết thúc với 200, nhưng nó có thể chuyển hướng bằng cách sử dụng thẻ meta hoặc javascript. Tìm hiểu những gì xảy ra sau đó là khó khăn.

Hãy nhớ rằng bất kỳ phương pháp nào bạn sử dụng, đều cần có thời gian để chờ phản hồi.
Tất cả các mã có thể (và có thể sẽ) dừng lại cho đến khi bạn biết kết quả hoặc các yêu cầu đã hết thời gian.

Ví dụ: mã bên dưới có thể mất nhiều thời gian để hiển thị trang nếu các url không hợp lệ hoặc không thể truy cập được:

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

Các chức năng dưới đây có thể hữu ích, bạn có thể muốn sửa đổi chúng cho phù hợp với nhu cầu của mình:

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

vì một số lý do, getHttpResponseCode_USE_curl () luôn trả về 200 trong trường hợp của tôi.
TD_Nijboer

2
nếu ai đó có cùng một vấn đề, hãy kiểm tra dns-nameervers .. sử dụng opendns mà không theo dõi stackoverflow.com/a/11072947/1829460
TD_Nijboer

+1 vì là câu trả lời duy nhất để đối phó với các chuyển hướng. Thay đổi return $codeđể if($code == 200){return true;} return false;sắp xếp ra chỉ thành công
Birrel

@PKHunter: Không. Regex preg_match nhanh của tôi là một ví dụ đơn giản và sẽ không khớp với tất cả các url được liệt kê trong đó. Xem url kiểm tra này: regex101.com/r/EpyDDc/2 Nếu bạn muốn một địa chỉ tốt hơn, hãy thay thế bằng địa chỉ được liệt kê trên liên kết của bạn ( mathiasbynens.be/demo/url-regex ) từ diegoperini; nó dường như khớp với tất cả chúng, xem testlink này: regex101.com/r/qMQp23/1
MoonLite 30/03/2017

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

Vì vậy, bất cứ khi nào bạn liên hệ với một trang web và nhận được một cái gì đó hơn 200 ok nó sẽ hoạt động


13
Nhưng nếu đó là một chuyển hướng thì sao? Tên miền vẫn còn hiệu lực, nhưng sẽ bị bỏ lại.
Eric Leroy

4
Trên một dòng : return strpos(@get_headers($url)[0],'200') === false ? false : true. Có thể hữu ích.
Dejv

$ đây là trong PHP là một tham chiếu đến đối tượng hiện tại. Tham khảo: php.net/manual/en/language.oop5.basic.php Primer: phpro.org/tutorials/Object-Oriented-Programming-with-PHP.html Nhiều khả năng các đoạn mã được lấy từ một lớp học và không cố định phù hợp .
Marc Witteveen

18

bạn không thể sử dụng curl trong một số máy chủ nhất định. Bạn có thể sử dụng mã này

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

nó có thể không hoạt động cho chuyển hướng 302-303 hoặc ví dụ 304 Không được sửa đổi
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
Điều này sẽ không hoạt động nếu cho phép url-fopen bị tắt. - php.net/manual/en/ Kẻ
Daniel Paul Searles

2
Tôi sẽ đề nghị chỉ đọc byte đầu tiên ... 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

Tôi sử dụng chức năng này:

/**
 * @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

Giải pháp get_headers () của karim79 không hiệu quả với tôi khi tôi nhận được kết quả điên rồ với 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] => 
) 

Dù sao, nhà phát triển này chứng minh rằng cURL nhanh hơn get_headers ():

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

Vì nhiều người đã yêu cầu karim79 sửa chữa là giải pháp cURL, đây là giải pháp tôi đã xây dựng ngày hôm nay.

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

Hãy để tôi giải thích các tùy chọn cuộn tròn:

CURLOPT_RETURNTRANSFER : trả về một chuỗi thay vì hiển thị trang gọi trên màn hình.

CURLOPT_SSL_VERIFYPEER : cUrl sẽ không kiểm tra chứng chỉ

CURLOPT_HEADER : bao gồm tiêu đề trong chuỗi

CURLOPT_NOBODY : không bao gồm phần thân trong chuỗi

CURLOPT_USERAGENT : một số trang web cần hoạt động chính xác (ví dụ: https://plus.google.com )


Lưu ý bổ sung : Trong chức năng này, tôi đang sử dụng biểu thức chính của Diego Perini để xác thực URL trước khi gửi yêu cầu:

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

Lưu ý bổ sung 2 : Tôi làm nổ chuỗi tiêu đề và tiêu đề người dùng [0] để đảm bảo chỉ xác thực mã trả về và thông báo (ví dụ: 200, 404, 405, v.v.)

Lưu ý bổ sung 3 : Đôi khi chỉ xác nhận mã 404 là không đủ (xem bài kiểm tra đơn vị), do đó, có một tham số $ failCodeList tùy chọn để cung cấp tất cả danh sách mã để từ chối.

Và, tất nhiên, đây là bài kiểm tra đơn vị (bao gồm tất cả các mạng xã hội phổ biến) để hợp thức hóa mã hóa của tôi:

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

Thành công lớn cho tất cả,

Jonathan Parent-Lévesque từ Montreal


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

3

khá nhanh:

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');

Cách quá phức tạp :) stackoverflow.com/questions/981954/
Khắc

Tôi nhận được ngoại lệ này khi url tồn tại: Không thể gọi CURLOPT_HEADERFUNCTION
safiot

3

Tất cả các giải pháp trên + thêm đường. (Giải pháp AIO cuối cùng)

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

Thí dụ:

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

3

để kiểm tra xem url là trực tuyến hay ngoại tuyến ---

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

Đây là một giải pháp chỉ đọc byte đầu tiên của mã nguồn ... trả về false nếu file_get_contents không thành công ... Điều này cũng sẽ hoạt động đối với các tệp từ xa như hình ảnh.

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

0

cách đơn giản là curl (và FASTER cũng vậy)

<?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

Một cách khác để kiểm tra xem URL có hợp lệ hay không có thể là:

<?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 () trả về một mảng với các tiêu đề được gửi bởi máy chủ để đáp ứng yêu cầu 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>';
}

0

cURL có thể trả về mã HTTP Tôi không nghĩ rằng tất cả các mã bổ sung đó là cần thiết?

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

Một điều cần xem xét khi bạn kiểm tra tiêu đề cho 404 là trường hợp một trang web không tạo ra 404 ngay lập tức.

Rất nhiều trang web kiểm tra xem một trang có tồn tại hay không trong nguồn PHP / ASP (et cetera) và chuyển bạn đến một trang 404. Trong những trường hợp đó, tiêu đề về cơ bản được mở rộng bởi tiêu đề của 404 được tạo. Trong những trường hợp đó, lỗi 404 không phải ở dòng đầu tiên của tiêu đề, mà là lỗi thứ mười.

$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

Tôi chạy một số thử nghiệm để xem các liên kết trên trang web của tôi có hợp lệ hay không - thông báo cho tôi khi bên thứ ba thay đổi liên kết của họ. Tôi đã gặp sự cố với một trang web có chứng chỉ được cấu hình kém, điều đó có nghĩa là get_headers của php không hoạt động.

VÌ VẬY, tôi đọc rằng curl nhanh hơn và quyết định cho nó đi. sau đó tôi gặp sự cố với Linkedin khiến tôi gặp lỗi 999, hóa ra đó là sự cố tác nhân người dùng.

Tôi không quan tâm nếu chứng chỉ không hợp lệ cho thử nghiệm này và tôi không quan tâm nếu phản hồi là trực tiếp.

Sau đó, tôi đã tìm ra cách sử dụng get_headers nếu curl không thành công ....

Thôi buông đi....

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

một loại chủ đề cũ, nhưng .. tôi làm điều này:

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

Sắp xếp .. Nhưng không chính xác.
hackdotslashdotkill

câu trả lời của bạn tốt hơn như thế nào?
Jah

@Jah rõ ràng không phải là ở mức -2. Có lẽ tôi đã đăng một đêm khuya này khi tôi ngủ một nửa sau khi nhìn chằm chằm vào màn hình cả ngày ..
hackdotslashdotkill
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.