2010-09-05 42 views
0

这个错误给了我几个小时的痛苦。这是我正在做的简化版本:这些情况都不符合get_headers()的结果

[01] $h = get_headers($url, 1); 
[02] $resp_code = $h[0]; 
[03] $resp_code = strtolower($resp_code); 
[04] $resp_code = str_replace(' ','',$resp_code); 
[05] echo 'just before going in. $resp_code = ' . $resp_code . '<br/>'; 
[06] switch ($resp_code) { 
[07] case 'http/1.1200ok': 
[08]  echo '200'; 
[09]  break; 
[10] case 'http/1.0301movedpermanently': 
[11]  echo '301'; 
[12]  break; 
[13] case 'http/1.0302movedtemporarily': 
[14]  echo '302'; 
[15]  break; 
[16] case 'http/1.0404notfound': 
[17]  echo '404'; 
[18] } 
[19] echo 'just got out.'; 

我得到的输出。尝试不同的网址,是不同的,对于一些网址,它工作正常,对于一些它根本不输出任何响应代码!即使从第5行显示的回显中,您预计应该输入其中一个case,但它不会,并且下一个输出来自第19行。

您可能想知道为什么我已将响应代码转换为全部较低的和剥离的空间,这是为了排除不同服务器发送的文本之间可能存在的细微差异。我不知道这是否会发生,这是为了以防万一,以免沮丧:(

它可能是字符编码相关的?通货膨胀/通货紧缩?PHP中的错误?我的系统上的病毒?

任何帮助,将不胜感激。

+0

get_headers的基础上有一定的缺陷,请参阅:http://stackoverflow.com/questions/12781795/get-headers-inconsistency – Baba 2012-10-08 15:33:31

回答

2

最后三个头与http/1.0。所以,如果它是一个1.1服务器任何情况下都将被匹配,它不返回200

也许你应该试试:

$h = get_headers($url, 1); 
$h = explode(' ', $h[0]); 
$responseCode = $h[1]; 

switch ($responseCode) { 
    case '200': 
    // ... 
} 
+0

谢谢真的。我会尝试并将结果发回。 – 2010-09-05 13:32:36

+0

它做到了!尽管我仍然感到震惊,但我最初使用的看似简单的方法却间歇性地失败了。所以,我想这是一些服务器返回http/1.0的结果,正如您先指出的那样。 – 2010-09-05 14:20:54

0

使用$_SERVER['SERVER_PROTOCOL']作为检查HTTP协议版本

+0

谢谢,但在这里我试图检查url是否返回200,301,302或404。但是,正如nikic所指出的,显然错误的协议数字会影响整个字符串的匹配。所以你的建议可以用来解析正确的长头部分,但解决方案nikic建议像魅力的作品。 – 2010-09-05 14:26:07

相关问题