31 votes

rediriger 404 vers des URL similaires

J'ai un site avec des histoires en elle. Je peux avoir plusieurs types d'histoires dans plusieurs catégories comme:

  • les enfants
  • romance
  • scifi
  • action
  • thriler
  • les quêtes

Les histoires sont accessibles à l'aide d'url comme:

www.example.com/action/story-name-action/
www.example.com/romance/story-name-romance/

et le premier param (action) et la deuxième (histoire-nom-action) sont redirigés avec .htaccess à l'aide de règles. Cette partie fonctionne très bien.

Dernièrement, je reçois quelques dizaines de 404 à partir de différents sites et voici ce que je veux faire, mais je ne sais pas comment:

Si quelqu'un, par exemple: /action/story-nme-ction, je veux rediriger vers: action/story-name-action/

Est-il un moyen efficace pour mettre en œuvre cette?

37voto

Olivier Pons Points 5085

Oh, l'homme, ô homme!

Ce que vous demandez n'est pas simple et besoin de vous pour avoir un ordinateur plus puissant, mais les résultats sont tout simplement incroyables.

Voici ce que je vous suggère de le faire:

  • Pour les 404 bonne manipulation, vous avez l' ErrorDocument de la redirection de configuration vhost. Le mien ressemble à ceci: ErrorDocument 404 /404.php ;
  • Lorsque vous rencontrez une erreur 404, Apache appel /404.php avec tous les arguments (d'une mauvaise URL, et ainsi de suite, dump $_SERVER pour le vérifier). Vous devez tester si il y a seulement deux expressions dans l'URL / d. http://mysite.com/(expr1)/(expr2)/
  • Si non, alors faire un classique de la 404.
  • Si oui, alors faites un SOUNDEX de recherche avec MySQL (dans votre 404 Php le fichier). Voir la requête de l'échantillon ici.
  • Alors, dans ce "spécial" 404 cas, faire une suggestion, comme google le fait, c'est à dire: "tu veux dire /action/story-name-action/? si oui, cliquez sur le lien".

Ce un travail dur, mais c'est à la fois intéressant et montre vos compétences. Très peu de sites font cela (je sais juste que google en fait).

Voici une démo sur ma table française qui pourrait vous donner un aperçu de la façon dont il fonctionne:

mysql> SELECT * FROM job WHERE
SOUNDEX( description ) LIKE SOUNDEX('Machiniste cinéma');
+-------+--------------------+
| id    | description        |
+-------+--------------------+
| 14018 | Machiniste cinéma  |
+-------+--------------------+
1 row in set (0.06 sec)

mysql> SELECT * FROM job WHERE
SOUNDEX( description ) LIKE SOUNDEX('Mchiniste cinéma');
+-------+--------------------+
| id    | description        |
+-------+--------------------+
| 14018 | Machiniste cinéma  |
+-------+--------------------+
1 row in set (0.06 sec)

mysql> SELECT * FROM job WHERE
SOUNDEX( description ) LIKE SOUNDEX('Machnste cinema');
+-------+--------------------+
| id    | description        |
+-------+--------------------+
| 14018 | Machiniste cinéma  |
+-------+--------------------+
1 row in set (0.06 sec)

mysql> 

18voto

symcbean Points 27412

Sauf si vous êtes très sûr de l'URL que l'utilisateur vraiment envie de naviguer, à l'aide de réécriture / redirection vers une URL spécifique est une très mauvaise idée.

Prendre votre exemple, supposons que vous souhaitez pour gérer tous les cas où les deux lettres ont été ignorés, avec 17 caractères dans la dernière partie de l'URL, c'est 17*16 = 272 combinaisons, il peut être possible pour correspondre à de multiples 'false' des url avec une regex, vous êtes stil va avoir besoin de beaucoup de règles de réécriture.

Une meilleure solution serait de mettre en œuvre 404 à l'aide de PHP (depuis que vous avez compris que la balise dans votre q), pour générer une liste de (dire) le top 10 des Url dont les chemins ont la plus courte distance de levenstein le chemin demandé, avec un lien par défaut et le texte qui l'accompagne. (Il y a mysql en fonction des implémentations - essayez de Google pour les Url). NB gestionnaire doit toujours retourner une erreur 404 état - NB contenu HTML doit être plus qu'une longueur minimale de supprimer MSIE est "amical" message d'erreur.

7voto

Leigh Points 8802

Si vous connaissez les bonnes Url pourrait être, vous pouvez utiliser:

levenshtein($givenURL, $possibleURL)

Exemple de PHP docs, commentaires supprimés pour des raisons de concision:

$input = 'carrrot';

$words  = array('apple','pineapple','banana','orange',
                'radish','carrot','pea','bean','potato');

$shortest = -1;

foreach ($words as $word) {
    $lev = levenshtein($input, $word);
    if ($lev == 0) {
        $closest = $word;
        $shortest = 0;
        break;
    }
    if ($lev <= $shortest || $shortest < 0) {
        $closest  = $word;
        $shortest = $lev;
    }
}

echo $shortest == 0 ? "Exact match found: $closest\n" : "Did you mean: $closest?\n";

Sorties:

Mot d'entrée: carrrot
Vouliez-vous dire: carotte?

Ce est bon quand vous pensez que les gens peuvent avoir omis une lettre ou mettre un de plus, mais il peut tomber à court quand les gens vraiment ne sais pas comment épeler un mot et est venu avec quelque chose de créatif!

Si vous préférez l' soundex() route, prendre un coup d'oeil à l' metaphone() fonction.

J'aime l'idée d'utiliser metaphone() côté levenshtein() ou similar_text(), car il renvoie à une représentation phonétique de la parole, et vous voulez toujours de voir comment elle est à votre original.

Exemples:

metaphone('name') = NM
metaphone('naaaaaameeeeeeee') = NM
metaphone('naiym') = NM
metaphone('naiyem') = NYM

Alors que beaucoup de fautes d'orthographe sera de retour identiques, le dernier exemple montre que vous avez vraiment encore envie de trouver la correspondance la plus proche avec quelque chose comme levenshtein()

Pour plus d'efficacité, si vous utilisez un autre 404 fichier où le réécrit essayé de correspondre à ce modèle et a échoué, que vous utilisez pour le reste du site, il ne devrait pas vraiment être une surcharge massive.

Si vous obtenez le même 404 de la même référent beaucoup, (et ne peut pas changer le lien) il pourrait être intéressant de simplement mettre un statique de la réécriture dans ce cas.

4voto

CodeCaster Points 38181

Il y a quelques solutions:

  • Identifier la source de la mauvaise URL. Ce doit tout simplement pas se produire, et je ne peux pas imaginer pourquoi il le fait. Autres personnes lier d'ailleurs et ils ont fait une faute de frappe (en ignorant l'existence de copier-coller)? Pouvez-vous voir d'où cela vient (referer) et de communiquer avec eux?
  • Ajouter un ID de l'URL, donc /action/123/story-name-action, où vous regardez l'article sur l'ID et non pas sur son titre (bonus: ajoute la possibilité de créer de multiples histoires de la même catégorie avec le même titre)
  • Faire une recherche floue sur le titre, en utilisant quelque chose comme soundex, et rediriger l'utilisateur vers la plus juste titre ou afficher une page de présentation avec look-alike des titres comme @symcbean suggère.

Je préfère l'ID d'un bien.

0voto

DaveRandom Points 45661

Puisque les valeurs sont (sans doute) d'être tiré à partir de MySQL, basée sur le titre, vous pouvez mettre un FULLTEXT index sur la colonne titre, et utiliser le MySQL MATCH() fonction pour trouver les plus pertinents de match, et rediriger l'utilisateur vers que.

Bien que ce sera pas une solution parfaite, - le type de renseignements nécessaires à cet effet, avec une réelle précision est tourne dangereusement du test de Turing territoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X