2010-09-05 5 views
0

Ce bug m'a donné des heures d'angoisse. Ceci est une version simplifiée de ce que je suis en train de faire:Aucun des cas ne correspond au résultat de 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.'; 

La sortie obtenue. essayer différentes URL, est différent, pour certaines urls cela fonctionne correctement et pour certains, il ne génère aucun code de réponse! Même si l'écho affiché à la ligne 5 indique que l'un des case doit être entré, ce n'est pas le cas et la sortie suivante provient de la ligne 19.

Vous vous demandez peut-être pourquoi j'ai converti les codes de réponse à tous Les espaces inférieurs et dénudés ont été utilisés pour tenter d'éliminer les différences mineures entre les messages envoyés par différents serveurs. Je ne sais pas si cela pourrait arriver ou non, il a été fait juste au cas et hors de consternation :(

Pourrait-il être codage de caractères liés? Inflation/déflation? Un bug dans PHP? Un virus sur mon système?

Toute aide serait grandement appréciée.

+0

get_headers a une faille voir: http://stackoverflow.com/questions/12781795/get-headers-inconsistency – Baba

Répondre

2

Les trois derniers sont en-têtes avec http/1.0. donc, aucun cas correspondre si elle est un serveur 1.1 et il ne retourne pas 200.

Peut-être que vous devriez essayer:

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

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

Merci vraiment. Je vais essayer et poster le résultat. –

+0

Il l'a fait! Bien que je sois encore choqué, la méthode apparemment simple que j'ai utilisée initialement échoue par intermittence. Donc, je suppose que cela a été le résultat de certains serveurs renvoyant http/1.0 comme vous l'avez indiqué en premier. –

0

utilisation $_SERVER['SERVER_PROTOCOL'] comme base pour vérifier la version du protocole HTTP

+0

Merci, mais ici j'essaie de vérifier si l'url renvoie un 200, 301, 302, ou 404. Mais comme nikic pointé, les numéros de protocole apparemment faux entraver une correspondance de chaîne complète. Donc, votre suggestion pourrait être utilisée pour analyser la section d'en-tête longue correcte, mais la solution proposée par nikic fonctionne comme charme. –

Questions connexes