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

Signaler
Messages postés
5
Date d'inscription
vendredi 2 janvier 2009
Statut
Membre
Dernière intervention
7 janvier 2011
-
kohntark
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
-
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

Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
10
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é ...
Messages postés
5
Date d'inscription
vendredi 2 janvier 2009
Statut
Membre
Dernière intervention
7 janvier 2011

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.
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
10
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>

';
}
?>
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
22
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 -
Messages postés
5
Date d'inscription
vendredi 2 janvier 2009
Statut
Membre
Dernière intervention
7 janvier 2011

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..)
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
22
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 -