Tester si une url est redirigée par un header langage php

ccpu Messages postés 5 Date d'inscription vendredi 2 janvier 2009 Statut Membre Dernière intervention 7 janvier 2011 - 17 nov. 2010 à 08:29
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 18 nov. 2010 à 18:58
Bonjour,

Tout d'abord je souhaite m'excuser si le thème choisi n'est pas le bon.

Je vous explique mon problème qui est résumé dans le titre :

Pour faire simple, je dois ajouter un lien vers un autre site uniquement si l'équivalent existe. Il s'agit d'une traduction.

Donc par exemple si j'ai un lien http://monsite.com/blabla je dois tester si http://monsitetraduit.com/blabla existe sauf que si cette page n'existe pas elle est redirigée via header à l'index http://monsitetraduit.com/. Donc je ne sais pas si il existe une fonction ou autre permettant de savoir si la page va être redirigée ou non.

Si je n'ai pas été assez clair, je peux ré-expliquer.

En espérant avoir des réponses de votre part, je vous remercie d'avance.

6 réponses

cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
17 nov. 2010 à 10:45
Bonjour

Pour tester le site et son url ainsi que la redirection pas de problème,
Mais la traduction automatique c'est un peu plus compliqué si c'est aussi
souhaité ...
0
ccpu Messages postés 5 Date d'inscription vendredi 2 janvier 2009 Statut Membre Dernière intervention 7 janvier 2011
17 nov. 2010 à 14:37
Merci pour ta réponse rapide.

Je voudrais tester si l'adresse va être redirigée ou non en fait.. Je pensais faire passer une variable dans le header un peu comme un booléen mais je ne vois pas trop comment je pourrais faire :/.
La traduction est déjà correctement gérée.
0
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
17 nov. 2010 à 15:40
Un truc vite bricolé et des liens pour une piste
faudra adapter


<?php
/*
http://www.gamerz.be/programmation-php-/t-php-tester-url-215751.html
http://www.phpsources.org/scripts92-PHP.htm
http://perishablepress.com/press/2006/12/18/automatic-language-translation-methods/
http://www.comscripts.com/scripts/php.babelfish-translator.2039.html
*/

/* article d'origine de la fonction
http://www.pckult.net/index.php?Itemid=7&id=806&option=com_content&task=view
test que le http port 80 pas de ftp,https ...
*/

function test_url($url){
    $url = @parse_url($url);

    if (!$url)
    {
        return false;
    }

    $url = array_map('trim', $url);
    $url['port'] = (!isset($url['port'])) ? 80 : (int)$url['port'];
    $path = (isset($url['path'])) ? $url['path'] : '';

    if ($path == '')
    {
        $path = '/';
    }

    $path .= (isset($url['query'])) ? "?$url[query]" : '';

    if (isset($url['host']) AND $url['host'] != gethostbyname($url['host']))
    {
        if (PHP_VERSION >= 5)
        {
            $headers = get_headers("$url[scheme]://$url[host]:$url[port]$path");
        }
        else
        {
            $fp = @fsockopen($url['host'], $url['port'], $errno, $errstr, 30);

            if (!$fp)
            {
                return false;
            }
            fputs($fp, "HEAD $path HTTP/1.1\r\nHost: $url[host]\r\n\r\n");
            $headers = fread($fp, 4096);
            fclose($fp);
        }
        $headers = (is_array($headers)) ? implode("\n", $headers) : $headers;
        return (bool)preg_match('#^HTTP/.*\s+[(200|301|302)]+\s#i', $headers);
    }
    return false;
}



if(isset($_POST['url_test']) && !empty($_POST['url_test']) &&  $_POST['submit_bt']=="Tester" ){
$url='http://'.$_POST['url_test'];

    if (test_url($url)) {
    
    echo $url.' est valide !
';
    echo '[javascript:history.back(); Recommencer un test]';
    
    /* choisir un type de redirection
    
    /* immediat
    header( 'Location:'.$url);
    */
    
    
    /* attendre 3 secondes
    header( 'refresh: 3; url='.$url);
    echo 'Bonne viste attendre 3 secondes...
';
    */
    
    /*
    header( 'refresh: 0; url='.$url);
    echo 'Bonne viste !
';
    */
    
    /* attendre 2 secondes
    echo '<meta http-equiv="refresh" content="2;url='.$url.'">';
    */
    
    } else {
    
    echo 'Url inconnue !
';
    echo '[javascript:history.back(); Recommencer un test]';
   
    }

} else {

echo '

<form action="" method="post">
http://

</form>

';
}
?>
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
17 nov. 2010 à 20:06
Salut,

Je ne comprends pas :
http://monsite.com/blabla
http://monsitetraduit.com/blabla

Puisque les deux sites t'appartiennent tu dois bien savoir si la page existe, non ?
Ceux sont des pages trop dynamiques peut être ? Autre chose ?

Si il ne s'agit que de rediriger vers l'index de la racine du site traduit un simple htaccess devrait suffire.


Cordialement,



Kohntark -
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ccpu Messages postés 5 Date d'inscription vendredi 2 janvier 2009 Statut Membre Dernière intervention 7 janvier 2011
18 nov. 2010 à 08:36
Merci cod57, je regarderais ça en détails et je te tiendrais au courant.


Oui je suis chargé des deux sites, et je sais également quelles pages n'existent pas mais comme toutes ces pages sont générées dynamiquement, je ne peux pas les traiter au cas par cas, il faut que je teste.

Il ne s'agit de rediriger, les htaccess sont déjà au point. En fait il faut vérifier si l'adresse va être redirigée ou non ( car j'ai un header qui s'occupe de ça si la page n'existe pas..)
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
18 nov. 2010 à 18:58
car j'ai un header qui s'occupe de ça si la page n'existe pas..

Désolé mais je ne comprends toujours pas.
Si je reprends ce que tu disais :
par exemple si j'ai un lien http://monsite.com/blabla je dois tester si http://monsitetraduit.com/blabla existe sauf que si cette page n'existe pas elle est redirigée via header à l'index http://monsitetraduit.com/


En quoi un htaccess sur le site monsitetraduit.com, qui redirigerait toutes les pages introuvables vers sa racine, ne conviendrait pas ???

Menfin je comprends sans doute de travers, et peut être cherches tu à afficher ce lien uniquement si il est valide.

Le code gentiment recopié par Cod57 est à mon avis bien trop lourd et ne réponds sans doute pas à ta problématique puisque ne tenant pas compte des redirections (j'ai lu en diagonale, je dis peut être une connerie, ... comme toujours en fait )

Un truc simple dans le genre devrait fonctionner, à condition que allow_url_fopen soit activé (sinon il faut peut être voir du côté des sockets):

$url = 'http://monsitetraduit.com/blabla';

$rContext = stream_context_create(array(
                    'http' => array(
                        'timeout' => 1,
                        'max_redirects' => 1
                    )
                )
);

if(false === @fopen($url, 'r', null, $rContext)) {
    // la page existe
} else {
    // la page n'existe pas
}


Bon, sans dire que ce soit du bricolage je trouve dommage que tu ne mettes pas à profit le fait que tu ais la main sur les 2 sites. Tu y gagnerai sans doute en performance, mais tout ça dépends grandement du contexte (nb de fois où sont testées les pages, fréquence des mises à jour des traductions et comment elles sont effectuées, etc ... etc ...)

Cordialement,

Kohntark -
0
Rejoignez-nous