2010-09-05 40 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

相關問題