2012-01-20 7 views
31

Ho un sito Web con storie in esso. Posso avere più tipi di storie all'interno di più categorie come:reindirizza 404 a URL simili

  • bambini
  • romanticismo
  • scifi
  • azione
  • thriler
  • missioni

Le storie sono accessibili tramite indirizzi come:

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

e il primo parametro (azione) e il secondo (nome-azione-azione) vengono reindirizzati con .htaccess utilizzando le regole. Questa parte funziona bene.

Ultimamente, ho qualche decina di 404 da diversi siti e qui è quello che voglio fare, ma non so come:

Se qualcuno digita, ad esempio: /action/story-nme-ction, voglio riorientare a: action/story-name-action/

Esiste un modo efficace per implementare questo?

+2

Per i file statici, c'è [mod_speling] (http://httpd.apache.org/docs/2.1/mod/mod_speling.html). –

+1

"ottengo qualche decina di 404 da siti diversi" Che cosa significa? Vuoi dire che i siti hanno collegamenti interrotti al tuo sito? –

risposta

37

Oh uomo, oh uomo!

Quello che stai chiedendo non è semplice e devi avere un computer potente, ma i risultati sono semplicemente sorprendenti.

Ecco quello che io suggerirei di fare:

  • Per 404 corretta manipolazione, avete la ErrorDocument reindirizzamento in configurazione vhost. Il mio assomiglia a questo: ErrorDocument 404 /404.php;
  • Quando si dispone di un 404, Apache chiamerà /404.php con tutti gli argomenti (quale URL errato e così via, scaricare $_SERVER per vedere questo). Bisogna verificare se ci sono solo due espressioni nella URL / cioè http://mysite.com/(expr1)/(expr2)/
  • Se no, poi fare un classico 404.
  • Se sì allora fare una ricerca SOUNDEX con MySQL (nel file 404 Php). Vedere la query campione here.
  • Quindi, in questo caso "speciale" 404, fai un suggerimento, come google, cioè: "intendevi dire /action/story-name-action/? Se sì, fai clic sul link".

Questo è un lavoro duro, ma è allo stesso tempo interessante e mostra la tua abilità. Pochissimi siti web fanno questo (conosco solo Google in realtà).

Ecco una demo sul mio tavolo francese che potrebbe dare una panoramica di come funziona:

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> 
+0

Soundex è inteso per l'analisi del linguaggio naturale - ha il vantaggio di venire con mysql out of the box, tuttavia i numeri hanno un significato molto specifico in soundex, e i non-alfanumerici non sono gestiti da esso (cosa significa "@? /!" suona come?) – symcbean

+2

Hai ragione. Ho appena suggerito l'unica soluzione che è la più vicina a ciò che Natalia vuole. E quello che vuole è quasi impossibile da fare. –

+0

Soundex è il _wrong_ algo qui perché mira a raggiungere l'invarianza fonetica. Quello che ti serve è Typex; -? - questa è una invarianza typo di qwerty, e questa è una misura completamente diversa: vale a dire una parola nell'URL una lettera o una trasposizione QWERTY diversa da una di una lista di parole conosciute. Potrebbero esserci algos open source relativi alle funzioni di controllo ortografico (ad esempio in Openoffice.org) che potrebbero essere un punto di partenza, ma questo sarà uno sforzo di molti mesi per un impatto insignificante sugli accessi - perché il delta sarà la% di typo-URL in cui l'utente non riproverà correttamente. – TerryE

0

Poiché i valori sono (presumibilmente) estratti da MySQL in base al titolo, è possibile inserire un indice FULLTEXT nella colonna del titolo e utilizzare la funzione MySQL MATCH() per trovare la corrispondenza più pertinente e reindirizzare l'utente a tale .

Anche se questa non sarà affatto una soluzione perfetta, il tipo di intelligenza richiesto per fare questo con un certo grado di accuratezza sta virando pericolosamente vicino al territorio Turing test.

18

A meno che non si sia certi dell'URL a cui l'utente desiderava realmente navigare, utilizzare la riscrittura/reindirizzamento a un URL specifico è una pessima idea.

Prendendo l'esempio, si supponga di voler gestire ogni caso in cui due lettere potrebbero essere state eliminate, con 17 caratteri nell'ultima parte dell'URL, ovvero 17 * 16 = 272 combinazioni, mentre potrebbe essere possibile associare più URL "falsi" con una regex, hai bisogno di molte regole di riscrittura.

Una soluzione migliore sarebbe quella di implementare il gestore 404 utilizzando PHP (dal momento che hai incluso quel tag nel tuo q), per generare un elenco di (diciamo) i primi 10 URL i cui percorsi hanno la distanza minima levenstein dal percorso richiesto , insieme a un link predefinito e testo di supporto. (Esistono implementazioni basate su mysql: prova Google per gli URL). Il gestore NB dovrebbe comunque restituire uno stato 404 - NB Il contenuto HTML deve essere più lungo di una lunghezza minima per sopprimere il messaggio di errore 'friendly' di MSIE.

+0

+1 .. Stavo proprio per scriverlo da solo .. Forse qualcosa come 'SOUNDEX' a livello MySQL potrebbe essere usato per trovare URL simili. Oppure 'SELECT * FROM pages WHERE pageUrl SOUNDS LIKE userEnteredUrl'. – bummzack

4

ci sono un paio di soluzioni:

  • identificare l'origine del guasto URL. Questo semplicemente non dovrebbe accadere e non riesco a immaginare perché lo faccia. Sono altre persone che collegano da altrove e hanno fatto un refuso (ignorando l'esistenza della copia & incolla)? Puoi vedere da dove proviene (referer) e contattarli?
  • Aggiungi un ID all'URL, quindi /action/123/story-name-action, dove si guarda l'articolo su ID e non sul suo titolo (bonus: aggiunge la possibilità di creare più storie della stessa categoria con lo stesso titolo)
  • Fare un fuzzy search sul titolo, utilizzando qualcosa come soundex e reindirizza l'utente sul titolo più adatto o mostra una pagina di panoramica con titoli simili a quelli suggeriti da @symcbean.

Preferisco l'ID uno però.

1

Abbiamo impostato redirect alla pagina di ricerca per url di come questo - la nostra ricerca ha "suggerito" caratteristica.

7

Se si sa che cosa le possibili URL corretti potrebbero essere, è possibile utilizzare:

levenshtein($givenURL, $possibleURL)

Esempio da documenti PHP, commenti rimossa per brevità:

$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"; 

Uscite:

Parola di immissione: carrot
Intendevi: carota?

Questo è un bene quando si pensa persone possono avere omesso una lettera o mettere uno in più, ma potrebbe cadere a breve, quando la gente davvero non so come si scrive una parola e si avvicinò con qualcosa di creativo!

Se si preferisce il percorso soundex(), dare un'occhiata alla funzione metaphone().

mi piace l'idea di utilizzare metaphone() fianco levenshtein() o similar_text() , in quanto restituisce una rappresentazione fonetica della parola, e si vuole ancora vedere come simile è a vostro originale.

Esempi:

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

Mentre un sacco di errori ortografici tornerà delle partite identico, l'ultimo esempio mostra che realmente vuole ancora trovare la corrispondenza più vicina con qualcosa di simile levenshtein()

Per l'efficienza, se si utilizza un diverso file 404 in cui le riscritture hanno cercato di abbinare questo modello e non è riuscito, rispetto a quello che si usa per il resto del sito, in realtà non dovrebbe essere un sovraccarico.

Se si ottiene lo stesso 404 dallo stesso referente, (e non è possibile indurli a cambiare il collegamento), potrebbe valere la pena di inserire una riscrittura statica in quel caso.