PHP如何测试给定URL是否返回403错误

PHP如何测试给定URL是否返回403错误,php,Php,如何测试给定URL是否为403错误 define('HTTP_STATUS', 403); echo var_dump(http_response_code("badURL.com")); 及 没有为我工作过 尝试实际获取它: $fp = fsockopen("badURL.com",80,$errno,$errstr,1); // 1 second timeout to prevent lag if( !$fp) echo "Failed to connect! ".$errno." ".$

如何测试给定URL是否为403错误

define('HTTP_STATUS', 403);
echo var_dump(http_response_code("badURL.com"));

没有为我工作过

尝试实际获取它:

$fp = fsockopen("badURL.com",80,$errno,$errstr,1); // 1 second timeout to prevent lag
if( !$fp) echo "Failed to connect! ".$errno." ".$errstr;
else {
    fputs($fp,"HEAD / HTTP/1.0\r\nHost: badURL.com\r\n\r\n");
    $line = fgets($fp); // get first line
    fclose($fp); // not interested in the rest
    list($version,$status,$statusText) = explode(" ",$line,3);
    var_dump($status);
}

尝试实际获取它:

$fp = fsockopen("badURL.com",80,$errno,$errstr,1); // 1 second timeout to prevent lag
if( !$fp) echo "Failed to connect! ".$errno." ".$errstr;
else {
    fputs($fp,"HEAD / HTTP/1.0\r\nHost: badURL.com\r\n\r\n");
    $line = fgets($fp); // get first line
    fclose($fp); // not interested in the rest
    list($version,$status,$statusText) = explode(" ",$line,3);
    var_dump($status);
}

http\u response\u code
用于设置或检索发送回调用PHP脚本的客户端的响应状态,而不是向位于Internet某处的其他服务发出请求

您可以使用
file\u get\u contents
向另一个服务发出请求,然后使用
$http\u response\u header
获取头(包括http响应代码)

这也将支持所有形式的URL,包括
HTTPS
(如果使用SSL支持编译的话)

如果您希望执行“HEAD”请求,以避免可能需要下载任何内容(…但可能有其自身的问题,其中可能不会返回相同的错误代码),您可以使用cURL或自定义HTTP谓词处理文件内容:

file_get_contents($url,
    false, 
    stream_context_create(array(
        'http' => array(
            'method' => 'HEAD' 
        )
    )
);
或者改用cURL:

$ch = curl_init($url);

// if you want to issue a HEAD request instead, uncomment the following
// updated from Havenard's comment - you might also want to set
// CURLOPT_SSL_VERIFYPEER to false if you don't want to verify SSL certificates.
// curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

return status;

http\u response\u code
用于设置或检索发送回调用PHP脚本的客户端的响应状态,而不是向位于Internet某处的其他服务发出请求

您可以使用
file\u get\u contents
向另一个服务发出请求,然后使用
$http\u response\u header
获取头(包括http响应代码)

这也将支持所有形式的URL,包括
HTTPS
(如果使用SSL支持编译的话)

如果您希望执行“HEAD”请求,以避免可能需要下载任何内容(…但可能有其自身的问题,其中可能不会返回相同的错误代码),您可以使用cURL或自定义HTTP谓词处理文件内容:

file_get_contents($url,
    false, 
    stream_context_create(array(
        'http' => array(
            'method' => 'HEAD' 
        )
    )
);
或者改用cURL:

$ch = curl_init($url);

// if you want to issue a HEAD request instead, uncomment the following
// updated from Havenard's comment - you might also want to set
// CURLOPT_SSL_VERIFYPEER to false if you don't want to verify SSL certificates.
// curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

return status;
您可以使用cURL:

$curl = curl_init('http://badurl.com/');
curl_setopt_array($curl, array(
   CURLOPT_NOBODY         => true, // use HEAD method, no body data
   CURLOPT_RETURNTRANSFER => true,
   CURLOPT_SSL_VERIFYPEER => false
));
curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
您可以使用cURL:

$curl = curl_init('http://badurl.com/');
curl_setopt_array($curl, array(
   CURLOPT_NOBODY         => true, // use HEAD method, no body data
   CURLOPT_RETURNTRANSFER => true,
   CURLOPT_SSL_VERIFYPEER => false
));
curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); 


考虑到清楚地声明此函数接受int,当您给它一个字符串时,您期望会发生什么?考虑到清楚地声明此函数接受int,当您给它一个字符串时,您期望会发生什么?考虑到
file\u get\u contents
将为任何4xx或5xx状态代码抛出大量错误消息,这可能是个坏主意。@mario file\u get\u contents设置了一个神奇的变量,名为
$http\u response\u header
,其中包含上次调用file\u get\u contents时的所有头@NIET:然后用@把它包起来。现在考虑目标是四十字节的兆字节文件的情况。然后呢?你要等它下载所有这些,这样你才能得到元数据吗?@niet好吧,这是一个有几个方面的问题;您可以发出常规HTTP请求并检索标头,也可以发出HEAD请求,该请求可能被拒绝或在另一端未得到正确处理。有些服务拒绝HEAD请求,同时允许GET通过。这两种方法都有好处和坏处。自己实现HTTP不是解决方案。在这种情况下,将CURL或自定义动词与file_get_内容一起使用。请记住,CURL默认情况下会将所有接收到的数据转储到默认输出(发送给用户)。你必须设置一些选项。另外,您不必使用
CURLOPT\u CUSTOMREQUEST
将方法设置为
HEAD
,有一个合适的选项可以这样做。考虑到
file\u get\u contents
会为任何4xx或5xx状态代码抛出大量错误消息,这可能是个坏主意。@mario file\u get\u contents设置了一个神奇的变量,名为
$http\u response\u header
,包含上一次调用file\u get\u内容的所有头@NIET:然后用@把它包起来。现在考虑目标是四十字节的兆字节文件的情况。然后呢?你要等它下载所有这些,这样你才能得到元数据吗?@niet好吧,这是一个有几个方面的问题;您可以发出常规HTTP请求并检索标头,也可以发出HEAD请求,该请求可能被拒绝或在另一端未得到正确处理。有些服务拒绝HEAD请求,同时允许GET通过。这两种方法都有好处和坏处。自己实现HTTP不是解决方案。在这种情况下,将CURL或自定义动词与file_get_内容一起使用。请记住,CURL默认情况下会将所有接收到的数据转储到默认输出(发送给用户)。你必须设置一些选项。另外,您不必使用
CURLOPT\u CUSTOMREQUEST
将方法设置为
HEAD
,有一个正确的选项可以这样做。这将测试一个坏的主机,而不是一个坏的URL。@Havenard您可以在
HEAD/HTTP/1.0
部分中插入您想要的任何请求路径/查询字符串,你知道……FISKFISK你认为这个或你的解决方案会更好/更快吗?谢谢你们!这将测试一个糟糕的主机,而不是一个坏的URL。@ HaveARD,您可以在“代码”标题/HTTP/1 部分中推送您想要的任何请求路径/查询字符串,您知道……FISKFISK,您认为这或您的解决方案更好/更快吗?谢谢你们!我得到一个语法错误意外的['`你知道那可能是什么吗?没关系。你有一个小语法错误。我更正了。谢谢!@thomas,这不是错误。你的PHP版本一定已经过时了。你可以使用方括号语法和数组以及
=>
和逗号?很抱歉我不知道。如果这更现代,我应该把它改回去吗?再次感谢。我得到了一个语法错误。`意外'['`你知道那可能是什么吗?没关系。你有一个小语法错误。我更正了。谢谢!@thomas,这不是错误。你的PHP版本一定已经过时了。你可以将方括号语法与数组以及
=>
和逗号一起使用?很抱歉我不知道。如果更现代,我应该把它改回去吗?再次感谢。