如何通过 PHP 检查 URL 是不是存在?

Posted

技术标签:

【中文标题】如何通过 PHP 检查 URL 是不是存在?【英文标题】:How can I check if a URL exists via PHP?如何通过 PHP 检查 URL 是否存在? 【发布时间】:2011-01-17 20:00:17 【问题描述】:

如何在 php 中检查 URL 是否存在(不是 404)?

【问题讨论】:

How can one check to see if a remote file exists using PHP? 的可能重复项 【参考方案1】:

我运行了一些测试以查看我网站上的链接是否有效 - 当第三方更改其链接时提醒我。我遇到了一个网站的问题,该网站的证书配置不当,这意味着 php 的 get_headers 不起作用。

所以,我读到 curl 更快,并决定试一试。然后我遇到了linkedin的问题,它给了我一个999错误,结果证明是用户代理问题。

我不在乎证书是否对该测试无效,也不在乎响应是否为重定向。

然后,如果 curl 失败,我想无论如何都要使用 get_headers....

试一试……

/**
 * returns true/false if the $url is valid.
 *
 * @param string $url assumes this is a valid url.
 *
 * @return bool
 */
private function urlExists(string $url): bool

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     // do not output response in stdout
    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 >= 200 && $http_code < 400) || $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(
        ['http' => ['method' => 'HEAD']]
    );
    $file_headers = @get_headers($url);

    if ($file_headers !== false) 
        $response_code = substr($file_headers[0], 9, 3);
        return $response_code >= 200 && $response_code < 400;
    

    return false;

【讨论】:

【参考方案2】:

这里:

$file = 'http://www.example.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;

从here和right below上面的帖子,有一个curl的解决方案:

function url_exists($url) 
    return curl_init($url) !== false;

【讨论】:

恐怕 CURL 方式不会这样工作。看看这个:***.com/questions/981954/… 一些网站在错误页面上有不同的$file_headers[0]。例如,youtube.com。其错误页面的值为HTTP/1.0 404 Not Found(差异为1.0 和1.1)。那该怎么办呢? 也许使用strpos($headers[0], '404 Not Found') 可以解决问题 @alexandru.topliceanu “未找到”文本状态是可选的;开发者可以放任何他们想要的东西,它仍然有效。 @Mark 同意了!澄清一下,strpos($headers[0], '404') 更好!【参考方案3】:

当从 php 中判断一个 url 是否存在时,需要注意以下几点:

url 本身是否有效(字符串,不为空,语法良好),这可以快速检查服务器端。 等待响应可能需要一些时间并阻止代码执行。 并非所有由 get_headers() 返回的标头都格式正确。 使用 curl(如果可以的话)。 阻止获取整个正文/内容,但仅请求标头。 考虑重定向网址: 要返回第一个代码吗? 还是按照所有重定向并返回最后一个代码? 您最终可能会得到 200,但它可以使用元标记或 javascript 进行重定向。弄清楚之后会发生什么是很困难的。

请记住,无论您使用哪种方法,等待响应都需要时间。 在您知道结果或请求超时之前,所有代码都可能(并且可能会)停止。

例如:如果 url 无效或无法访问,下面的代码可能需要很长时间才能显示页面:

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

以下功能可能会有所帮助,您可能需要修改它们以满足您的需要:

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

【讨论】:

出于某种原因 getHttpResponseCode_using_curl() 在我的情况下总是返回 200。 如果有人遇到同样的问题,请检查 dns-nameservers.. 使用没有跟随重定向的 opendns ***.com/a/11072947/1829460 +1 是处理重定向的唯一答案。将 return $code 更改为 if($code == 200)return true; return false; 以仅排序成功 @PKHunter :不。我的快速 preg_match 正则表达式是一个简单的示例,不会匹配其中列出的所有 url。请参阅此测试网址:regex101.com/r/EpyDDc/2 如果您想要一个更好的,请将其替换为来自 diegoperini 的链接 (mathiasbynens.be/demo/url-regex) 中列出的那个;它似乎与所有这些都匹配,请参阅此测试链接:regex101.com/r/qMQp23/1 找到很多有效的 URL 在 exec 上返回 CURL 错误 60。 "SSL 证书问题:无法获取本地颁发者证书"【参考方案4】:

到目前为止使用 get_headers() 的最佳和最简单的答案 检查字符串“200 ok”的最佳方法。它比检查要好得多

$file_headers = @get_headers($file-path);
$file_headers[0];

因为有时数组键号会发生变化。所以最好的办法是检查“200 ok”。任何启动的 URL 在 get_headers() 响应中的任何位置都会显示“200 ok”。

function url_exist($url) 
        $urlheaders = get_headers($url);
        //print_r($urlheaders);
        $urlmatches  = preg_grep('/200 ok/i', $urlheaders);
         if(!empty($urlmatches))
           return true;
         else
           return false;
         

现在检查函数是真是假

if(url_exist(php-url-variable-here)
  URL exist
else
  URL don't exist

【讨论】:

【参考方案5】:

有点旧的线程,但是.. 我这样做:

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

【讨论】:

排序.. 但不完全是。 你的答案如何更好? @Jah 显然不是 -2。我可能在一天晚上盯着屏幕半睡半醒的时候发了这个。..【参考方案6】:

在检查 404 标头时要考虑的一件事是网站不会立即生成 404 的情况。

很多网站会在 PHP/ASP(等等)源代码中检查页面是否存在,然后将您转发到 404 页面。在这些情况下,标头基本上由生成的 404 标头扩展。在这些情况下,404 错误不在标题的第一行,而是在第十行。

$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 
) 

【讨论】:

【参考方案7】:

cURL 可以返回 HTTP 代码我认为不需要所有额外的代码?

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;
        
    

【讨论】:

【参考方案8】:
function url_exists($url) 
    $headers = @get_headers($url);
    return (strpos($headers[0],'200')===false)? false:true;

【讨论】:

【参考方案9】:

get_headers() 返回一个数组,其中包含服务器为响应 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>';

【讨论】:

【参考方案10】:

检查 url 是在线还是离线 ---

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

【讨论】:

【参考方案11】:

以上所有解决方案 + 额外的糖。 (终极一体机解决方案)

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

示例:

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

【讨论】:

【参考方案12】:

这是一个仅读取源代码第一个字节的解决方案...如果 file_get_contents 失败则返回 false...这也适用于图像等远程文件。

 function urlExists($url)

    if (@file_get_contents($url,false,NULL,0,1))
    
        return true;
    
    return false;

【讨论】:

【参考方案13】:

检查 URL 是否有效的其他方法可以是:

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

【讨论】:

【参考方案14】:

我使用这个功能:

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

【讨论】:

【参考方案15】:

karim79 的 get_headers() 解决方案对我不起作用,因为我使用 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] => 
) 

无论如何,这个开发者证明 cURL 比 get_headers() 快得多:

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

由于很多人要求 karim79 修复的是 cURL 解决方案,这就是我今天构建的解决方案。

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

让我解释一下 curl 选项:

CURLOPT_RETURNTRANSFER:返回一个字符串,而不是在屏幕上显示调用页面。

CURLOPT_SSL_VERIFYPEER:cUrl 不会签出证书

CURLOPT_HEADER:在字符串中包含标题

CURLOPT_NOBODY:不要在字符串中包含正文

CURLOPT_USERAGENT:某些网站需要它才能正常运行(例如:https://plus.google.com)


附加说明:在这个函数中,我使用 Diego Perini 的正则表达式在发送请求之前验证 URL:

const URL = "%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d1,3(?:\.\d1,3)3|(?:(?:[a-z\d\x00a1-\xffff]+-?)*[a-z\d\x00a1-\xffff]+)(?:\.(?:[a-z\d\x00a1-\xffff]+-?)*[a-z\d\x00a1-\xffff]+)*(?:\.[a-z\x00a1-\xffff]2,6))(?::\d+)?(?:[^\s]*)?$%iu"; //@copyright Diego Perini

附加说明2:我分解了标头字符串和用户标头[0],以确保仅验证返回码和消息(例如:200、404、405 等)

附加说明 3:有时仅验证代码 404 是不够的(请参阅单元测试),因此有一个可选的 $failCodeList 参数来提供所有要拒绝的代码列表。

当然,这里是使我的编码合法化的单元测试(包括所有流行的社交网络):

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

大家都取得了巨大的成功,

来自蒙特利尔的Jonathan Parent-Lévesque

【讨论】:

【参考方案16】:
function urlIsOk($url)

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

【讨论】:

【参考方案17】:

你不能在某些服务器上使用 curl 你可以使用这个代码

<?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 重定向或例如 304 Not Modified【参考方案18】:

简单的方法是卷曲(也更快)

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

?>

【讨论】:

【参考方案19】:
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;

【讨论】:

php 手册建议不要使用strstr() 来检查子字符串的存在——它鼓励使用strpos()【参考方案20】:
$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'.

【讨论】:

如果 allow-url-fopen 关闭,这将不起作用。 - php.net/manual/en/… 我建议只读取第一个字节... if (@file_get_contents($url,false,NULL,0,1))【参考方案21】:
$headers = @get_headers($this->_value);
if(strpos($headers[0],'200')===false)return false;

因此,只要您联系网站并获得 200 以外的其他内容,它就会起作用

【讨论】:

但是如果是重定向呢?该域仍然有效,但将被排除在外。 一行以上:return strpos(@get_headers($url)[0],'200') === false ? false : true。可能有用。 $this 在 PHP 中是对当前对象的引用。参考:php.net/manual/en/language.oop5.basic.php Primer:phpro.org/tutorials/Object-Oriented-Programming-with-PHP.html 代码 sn-p 很可能是从一个类中获取的,并且没有相应地修复。 改进 Dejv 的评论 -> return strpos(@get_headers($url)[0],'200'); 成功响应码很多,不止200...【参考方案22】:

相当快:

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

【讨论】:

太复杂了:) ***.com/questions/981954/… 当 url 存在时我得到这个异常:无法调用 CURLOPT_HEADERFUNCTION

以上是关于如何通过 PHP 检查 URL 是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查一个值是不是已经存在以避免重复?

如何通过 ssh 检查 ubuntu 服务器上是不是存在 php 和 apache

如何检查或验证 URL 是不是存在 - 返回 CORS 错误?

如何在不下载的情况下使用其 URL 检查文件是不是存在?

如果 URL 已存在于数据库中,如何使用 PHP 检查?

如何检查ajax返回是不是存在? [复制]