2009-08-31 5 views
2

Hej là,Fetch-tête de réponse HTTP/redirection état avec PHP

Je travaille actuellement sur un outil basé sur PHP pour surveiller un assez grand nombre d'URL et leur statut de redirection. J'ai passé beaucoup de temps à trouver le meilleur moyen de récupérer le contenu des en-têtes de réponse HTTP pour extraire le code et l'emplacement de redirection actuels. Voici comment c'est fait pour le moment:

$resource = fopen($url, 'r'); 
$metadata = stream_get_meta_data($resource); 
$metadata = $metadata['wrapper_data']; 

// Looping through the array to find the necessary fields 

Cela fonctionne sur 95% des URL que je surveille. Pour un peu plus, je l'ai résolu en analysant le code HTML réel que le site Web retourne avant que la redirection soit exécutée, car il contenait quelque chose comme "Ce site a été déplacé ici". Cela ne semble pas être une solution très robuste, mais cela a aidé dans quelques cas.

Cela me laisse toujours avec un certain nombre d'URL que je ne peux pas vérifier automatiquement.

Des outils comme Ask Apache HTTP Headers Tool semblent être plus fiables et je me demandais ce qui pourrait être une meilleure façon d'obtenir l'information de redirection?

+0

http://stackoverflow.com/questions/270918/how-do-you-get-the-http-status-code-for-a-remote-domain-in-php – karim79

+0

Désolé, que l'on n'a pas montré dans la liste des questions similaires. Cependant, il y a une nouvelle solution à la question ici. –

Répondre

6

Vous pouvez également essayer boucle, par exemple le plus court possible qui récupère tous les en-têtes ressemble à ceci:

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://stackoverflow.com'); 
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header'); 
curl_setopt($ch, CURLOPT_NOBODY, 1); 
curl_exec($ch); 

function read_header($ch, $string) { 
    print "Received header: $string"; 
    return strlen($string); 
} 

Sortie:

[~]> php headers.php 
Received header: HTTP/1.1 200 OK 
Received header: Cache-Control: private 
Received header: Content-Type: text/html; charset=utf-8 
Received header: Expires: Mon, 31 Aug 2009 09:38:45 GMT 
Received header: Server: Microsoft-IIS/7.0 
Received header: Date: Mon, 31 Aug 2009 09:38:45 GMT 
Received header: Content-Length: 118666 
Received header: 

Bien sûr, il est juste en-têtes que vous voulez, puis fsockopen fonctionne aussi bien. Sauf qu'au lieu de GET, vous devriez utiliser HEAD, parce que vous voulez juste les en-têtes, pas le contenu.

De plus, curl fonctionne (à condition que vous l'ayez compilé avec le support ssl) pour les URLs https.