Costuirsi un permalink nuovo senza perdere il vecchio

ApacheMolti hanno letto che sto lavorando ad una nuova piattaforma di blogging. Il mio intento (tempo permettendo) è quello di ritrovarmi con qualcosa che risponda scrupolosamente alle mie esigenze.

Potendo sfruttare Apache sul nuovo server che (spero entro 3 mesi) ospiterà il blog, una delle cose che ho subito fatto è impostare un permalink che eliminasse qualsiasi tipo di query string.

Mi si pongono però due questioni:

  • Come impostare il nuovo permalink?
  • Come non perdere l’indicizzazione dei motiri di ricerca?

Mantenere l’indicizzazione
Cominciamo con il risolvere la questione più importante: voglio che nessuno possa vedersi rispondere da un errore 404 se mi ha trovato da un vecchio permalink. Per farlo, basta impostare un redirect permanent nel file .htaccess in modo tale che la ridirezione avvenga al giusto post!
In parole povere chi chiede la pagina: dblog/articolo.asp?articolo=ID dovrà essere ridirezionato su index.php?post=ID.

Basta una riga di .htaccess 🙂

RedirectMatch 301 dblog/articolo.asp?articolo=(.*) /index.php?p=$1

In questo modo chiunque chieda una pagina del vecchio blog sarà reindirizzato alla query string del nuovo blog in automatico.
Con la notazione 301 (che avrei potuto sostituire con la parola "permanent") informo i motori di ricerca che il cambiamento è permanente e li invito ad aggiornare i loro archivi.

Friendly Permalink
In un sistema di blogging in cui tutto gira sull’ID degli articoli (chiave primaria ovviamente, quindi unico elemento irripetibile in due o più post), la query che si occupa di selezionare l’articolo nella relativa tabella usa proprio questo parametro come discriminante.

Vista anche la struttura del vecchio permalink la tentazione di strutturarlo in questo modo:

http://www.davidonzo.com/p/ID

E’ stata grande. Ma perchè non inserire anche il title nel permalink? Il risultato è una maggiore reperibilità di informazioni da parte dei motori di ricerca. Nonchè una maggiore leggibilità umana dell’argomento del link (forse sono il solo, ma leggo sempre il link nella pagina risultati del motore di ricerca).

Mi sono deciso! Anche il title deve far parte del permalink! Come lo strutturo per far si di non creare nuovi campi nella tabella dei post ed evitando di modificare la query più importante dell’applicazione? Facile 🙂 Uso la stessa funzione che si occupa di estrapolare il titolo del post, sostituisco i caratteri non alfanumerici con dei trattini ed il permalink è bello che fatto!

Andiamo con calma:
– Ipotizziamo che il titolo del post sia la variabile $title. Per ripulire il title dagli spazi e da altri caratteri che è meglio non compongano un’URL pasterà fare la seguente:

$title = preg_replace(‘#[^a-zA-Z0-9]#’, ‘-‘, $title);

Se nel titolo è compreso un carattere non alfanumerico sostituisco il matching con un trattino. Perchè proprio il trattino? Perchè nelle URL questo è letto dai motori di ricerca come uno spazio, quindi sarà indicizzato per quello che è come frase e non come singola parola. Eventualità che si sarebbe verificata se invece del trattivo avessi usato l’underscore (il trattino basso).
Provate un po’ a cercare su google "Tutto_Gratis", "Tutto-Gratis" e "Tutto Gratis". La seconda e la terza ricerca avranno risultati identici, la prima differirà di molto 🙂

Alla fine il permalink sarà un qualcosa del genere.

http://www.davidonzo.com/p/ID/Titolo-Del-Post/

Ma mi si pone un altro problema! Come regolarmi con il redirect permanent sopra impostato?
La soluzione più logica mi è sembrata prevedere per i primi tempi una convivenza fra permalink, impostando un redirect coerente con il nuovo formato.

RewriteRule ^p/([^/.]+)/(.*)/?$ index.php?p=$1 [L]
RewriteRule ^p/([^/.]+)/?$ index.php?p=$1 [L]

#Ridireziono nel giusto modo anche il vecchio permalink

RedirectMatch 301 dblog/articolo.asp?articolo=(.*) /p/$1

Critiche, suggerimenti o fanculizzazioni?
Sono sempre gradite…

11 thoughts on “Costuirsi un permalink nuovo senza perdere il vecchio”

  1. Interessante !
    Pero’ non potevo evitare di fare il pignolo:
    RedirectMatch 301 dblog/articolo.asp=(.*) /index.php?p=$1
    Forse voleva essere
    RedirectMatch 301 dblog/articolo.asp?articolo=(.*) /index.php?post=$1
    ; - )

    Comunque Apache non finira’ mai di stupirmi … Quasi quasi mi vergogno di averlo rimpiazzato sul serverino casalingo con lighttpd : - ..

  2. @ Giambo: posso chiamarla p, post o suk indifferentemente ^_^ . La p era giusto d’esempio.

    @ Gianni: speranzoso dei tuoi rilievi.

  3. No, forse Giambo intendeva la parte prima del primo “=”…
    L’hai scritta bene nell’ultimo esempio, ma t’è rimasta attaccata alla tastiera nel primo.

    Grazie per il post, Davidonzo… Stavo “lavorandoci” sopra, ma non m’era proprio venuta l’idea di usare SIA l’id che il Titolo-del-post.
    E se ho ben capito, il titolo-del-post è una “coda” utile per l’occhio umano o di google, ma ininfluente (in quanto non preceduta da “&”) per il codice in index.php.
    Non altera il valore dell’array $_GET, ma entra soltanto, volendola usare, in $_SERVER[‘REQUEST_URI’].
    Giusto?
    Tanto per complicarmi la vita, vale anche per me che c’ho una struttura del tipo:
    index.php?id=n&page=n
    in cui il secondo parametro è solo facoltativo (cioe’ può esserci ma anche no)?
    Mi sa che dovrei aggiungere qualche Rule…
    Dirai che potrei provare da solo…
    E hai ragione, ma con la sintassi di Apache navigo a vista….

  4. Miii vero! Scusa Giambo e grazie, corretto!

    Non c’entra il carattere &, anzi, se volessi scrivere il permalink in formato query string scriverei

    index.php?post=ID&title=titolo-del-post
    Tuttavia è solo un placebo, non un vero parametro. Difatti non si crea una nuova chiave per $_GET.

    Il tuo secondo parametro è alternativo, ma se c’è cosa fa? E il primo è l’id di un post?

  5. Il primo è l’id del post…
    Il secondo gestisce il “sommario” degli articoli della stessa “sezione”, 10 titoli alla volta.
    Serve in caso uno voglia “scorrere” tra i titoli dei post precedenti *senza* abbandonare la lettura della pagina (più correttamente: del post) corrente.

    Sara’ macchinoso, ma funziona.
    E’ una di quelle “feature” che ci si può consentire con una piattaforma personalizzata rinunciando a WordPress.
    (Qualcuno dirà certamente che si potrebbe fare anche con wordpress, ma scommetto che lì sarebbe ancora più macchinoso…)

    Non per attirare visite subdolamente, ma per vedere come funziona basta che fai un salto : - )
    E’ l’orribile (mai detto di saper fare il designer) freccia verde sulla colonna di destra, ovviamente sul mio sito…

  6. Capito. Bellina come idea 🙂

    In termini di rewrite puoi fare una cosa del genere. Nel file .htaccess

    RewriteRule ^idart/([^/.]+)/page/([^/.]+)/?$ index.php?idart=$1&page=$2 [L]

    Non ho testato, ma dovrebbe funzionare.
    Io però una cosa del genere la implementerei con AJAX. Per navigare una colonna ti tocca ricaricare ogni volta tutta la pagina, con AJAX invece lo fai solo per la porzione di pagina interessata.

    Poi magari manterrai il link attivo per i client che hanno javascript disabilitato nel browser.

  7. Ciao, scrivo qui perchè avrei bisogno di una mano riguardo la migrazione tra due diverse strutture di permalink in wordpress.
    Mi spiego: la mia attuale struttura è http://www.indirizzo.it/archives/%post_id%
    io vorrei farlo diventare http://www.indirizzo.it/%category%/%postname%
    E' possibile secondo te? Ho già scritto più di 100 articoli e sono presente su diversi aggregatori, quindi mi seccherebbe perdere i risultati raggiunti… Spero tu mi possa aiutare, non so proprio dove sbattere la testa!

    Grazie 1000

  8. Non sono sicuro al 100%, ma wordpress dovrebbe gestire in autonomia i redirect 301. Quindi potresti dover cambiare il permalink da pannello senza fare altro e non perdere comunque i link passati.

  9. No, purtroppo ho provato e i links si perdono… Da errore 404. Ho provato anche con dei plugin, ma nulla… 🙁
    Mi sa che non c'è via d'uscita… me lo devo tenere così, vero?

  10. da poco ho aggiornato i miei permalink dal tipo /data/nome articolo a quello /categoria /nome articolo

    Ora nei suggerimenti HTML di webmaster tool ho 1600 titoli e descrizioni duplicate perchè Google ancora vede tutti gli articoli con tre permalink es:

    Questo è uno dei tanti che vede google nei suggerimenti html:

    *Cercare il titolo di una canzone da un pezzo di testo, un motore di ricerca per i testi delle canzoni –> Questo è il post e viene visto come:

    http://www.creareonline.it/2008/11/25/cercare-il-titolo-di-una-canzone-da-un-pezzo-di-testo-un-motore-di-ricerca-per-i-testi-delle-canzoni ( prima erano così )
    http://www.creareonline.it/2008/11/25/cercare-il-titolo-di-una-canzone-da-un-pezzo-di-testo-un-motore-di-ricerca-per-i-testi-delle-canzoni/post-001477 ( poi ho aggiunto un numero ai post )
    http://www.creareonline.it/applicazioni/cercare-il-titolo-di-una-canzone-da-un-pezzo-di-testo-un-motore-di-ricerca-per-i-testi-delle-canzoni/post-001477 ( infine ho cambiato la data con la categoria )

    In sostanza per ogni post ci sono 3 permalink!!! E tutti funzionanti!!

    Che mi consigliate di fare?? Grazie in anticipo, il sito in questione come si capisce è http://www.creareonline.it

Comments are closed.