2010-11-05 6 views
0

Salut Je cherche à mettre en œuvre une fonction similaire à celle observée sur deviantART si une personne clique sur un lien externe: par exemple: http://www.deviantart.com/users/outgoing?http://driz.co.uk/PHP sortant/Lien externe

Quelle serait la meilleure façon de mettre en œuvre une telle fonctionnalité ? De son apparence sur dA ils éditent juste tous les liens externes pour avoir le préfixe http://www.deviantart.com/users/outgoing? puis montrent cette page qui leur permet de visiter le site ou de revenir. Alors peut-être que j'aurais besoin de mettre en œuvre un moyen de vérifier quels liens ne sont pas sur le domaine en cours et ensuite les préfixer avec une URL spéciale pour montrer une page de progression.

Ou peut-être juste en ajoutant le rel="external" aux liens, puis en quelque sorte pour tous les liens qui ont l'étiquette rel de externe aller à la page comme ça ou peut-être afficher une boîte de dialogue montrant le même message.

Vive

Répondre

1

La meilleure façon serait de changer vos liens où la nouvelle URL serait un script de votre propre qui redirige les utilisateurs en fonction de la chaîne de requête. Si vous souhaitez conserver la même structure d'URL que deviantArt, utilisez $_SERVER['QUERY_STRING'] pour saisir l'URL dans votre script de redirection.

2

La partie détection: un lien n'a besoin de ce type de décoration que s'il s'agit d'un lien cliquable fourni par l'utilisateur. Vous avez déjà l'infrastructure pour transformer les liens fournis par l'utilisateur en liens cliquables (sinon, vous avez un problème majeur de sécurité), il vous suffit donc de brancher tous ces liens dans une fonction de décorateur.

La partie décoration: possède une fonction acceptant un argument URL. Si la première partie de l'argument est "http://votre.domaine.nom", ou s'il s'agit d'un lien relatif (ne commence pas par un protocole comme http: //), laissez-le tranquille. Sinon:

$url = "http://your.domain.name/outgoing.php?".urlencode($url); 

Cela garantira que les caractères non protégés dans l'URL d'origine sont correctement échappés.

La partie de redirection: dans le script outgoing.php il suffit de regarder à l'intérieur array_keys($_GET) pour trouver l'URL et afficher la page appropriée.

3

Pour le code HTML d'entrée utilisateur, utilisez une expression régulière:

<\s*a\s+[^>]*href\s*=\s*[\"']?([^\"' >]+)[\"' >] 

où 1 $ sera le href, vous pouvez maintenant effectuer le test:

(\w:\/{2})?([\w\.]+) 

si 2 $ n'est pas un de vos domaines vous besoin de réécrire le href, afin de localiser la position de 1 $ dans la première regexp (strpos en php) et ajoutez votre url masque

http://yourdomain.com/maskurl? 

La chaîne de requête telle quelle sera l'URL que vous souhaitez rediriger vers

Si vous imprimez les liens avec une URL donnée, vous ne devez passer que la seconde.

La première regexp d'ici: http://www.onaje.net/content/working-regular-expressions-href-url-extractor et l'autre a été écrit par moi, mais testé aucun.

0

Il y a plusieurs façons d'aborder cela, en fonction de la façon dont les pages sont générées. Si tous les liens sont générés par PHP, alors il pourrait facilement être fait en comparant l'URL du lien à celle du site. Si elles sont différentes, ajoutez votre page de passe-droit au début de l'URL, comme cela a été fait par DA.

Je viens de terminer un script pour ajouter des icônes de liens externes à côté de chaque lien, de la même manière que Wikipédia le fait. Pour ce site particulier, j'ai dû travailler avec de nombreuses pages qui ont un contenu statique. L'utilisation de la méthode PHP mentionnée ci-dessus ne fonctionnerait pas bien pour cela. Au lieu de cela, j'ai implémenté quelque chose en Javascript. En utilisant jQuery, je sélectionne toutes les balises d'ancrage qui commencent par "http: //" ou "https: //", puis je passe en revue chacune d'entre elles pour vérifier si le domaine correspond à mon nom actuel. Si c'est différent, j'ajoute l'icône à côté du lien. Vous pouvez faire la même chose, mais au lieu de préfixer le href de l'ancre avec votre page passthough.

1

Excellente aide Netcoder. Ceci est la pleine php de la partie de redirection:

<?php 

$redirect = $_SERVER['QUERY_STRING'].''; 

?> 

<html><head> 

<meta name="robots" content="noindex" /> 

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> 


<title>Your Page title</title> 

</head><body> 

your Site Content 

</body> 

<SCRIPT LANGUAGE="JavaScript"> 

setTimeout("location.href ='<?php echo $redirect ?>'",30); 

</script> 

</html> 

votre contenu du site est ce que vous voulez montrer. est l'heure en secondes à attendre avant la redirection. Enregistrer comme outgoing.php (ou quoi que ce soit )

Lien externe doit être dans ce format: http://your-nice-domain.com/outgoing.php?http://the-external-domain.com/external-path.any

Important:

  1. Robot ce fichier php à partir robots.txt

  2. Ce sera la même chose que dA sauf: la redirection est automatique.

0
<?php 
$html = '<a href="http://google.com/somethingelsewhere">Something</a>' 
     . '<a href="http://example.com/somethinginmysite">My site!</a>'; 

echo preg_replace_callback('/<\s*a\s+[^>]*href\s*=\s*["\']?([^"\' >]+)["\' >]/', function($m) { 
    // initialise the data variable from your object 
    $link = $m[1]; 

    // early return 
    if(strpos($link, 'http://example') === 0) return $m[0]; 

    $linklen = strlen($m[1]); 
    $start = strlen($m[0]) - $linklen - 1; 

    $replacement = 'http://example.com/mymask?link=' . urlencode($link); 
    return substr_replace($m[0], $replacement, $start, $linklen); 
}, $html); 
Questions connexes