Scritto da davidonzo il 30/05/2007, in OpenSource
ATTENZIONE!
L'articolo che stai leggendo è stato scritto 539 giorni orsono.
Le informazioni presenti potrebbero non essere aggiornate!
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...
Hai trovato l'articolo interessante?
Sottoscrivi il Feed RSS per essere informato automaticamente degli ultimi aggiornamenti!
 
.Commenti rss
# 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 : - ..
Di Giambo  (Inviato il 30/05/2007 @ 18:21:18)
# 2
tutto molto interessante, prendo appunti delle problematiche non si sa mai ci faccio un pensierino anch'io.
Di Gianni Amato  (Inviato il 30/05/2007 @ 18:32:16)
# 3
@ Giambo: posso chiamarla p, post o suk indifferentemente ^_^ . La p era giusto d'esempio.

@ Gianni: speranzoso dei tuoi rilievi.
Di davidonzo  (Inviato il 30/05/2007 @ 18:53:54)
# 4
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....
Di marco  (Inviato il 30/05/2007 @ 20:11:01)
# 5
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?
Di davidonzo  (Inviato il 30/05/2007 @ 21:55:31)
# 6
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...
Di marco  (Inviato il 30/05/2007 @ 22:50:48)
# 7
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.
Di davidonzo  (Inviato il 30/05/2007 @ 23:44:00)


I commenti possono essere moderati.
Se non lo vedi comparire subito non reinserirlo più volte.
Grazie per la gentile collaborazione.