Trasformare le URL rendendole SEO friendly per i Motori di Ricerca.

Iniziamo questa nuova settimana parlando di un’argomento che la gran parte degli sviluppatori web conoscono bene il mod_rewrite di Apache un modulo in grado di creare URL chiare e gradite ai motori di ricerca, invece degli url criptici che generalmente vengono creati dinamicamente.

L’intento di questo articolo oltre a chiarire alcuni aspetti un pò complessi, vuole aiutare chi si avvicina per la prima volta a queste problematiche a capirne i fondamenti con vari esempi chiarificatori che possono supportarvi in tal senso.

Cercheremo di analizzarne il funzionamento base, anche se è uno strumento davvero complesso e potente che permette praticamente di fare qualsiasi cosa con le URL dallo sniffing della lingua allo smistamento di traffico e cosi via.

Noi vedremo, per adesso, come è possibile trasformare i poco chiari URL dinamici in semplici URL statici per essere più appetibili dai motori di ricerca ed avere dei link più chiari e brevi.

La prima cosa da fare, logicamente è attivare questo modulo, il mod_rewrite in genere è attivo su ogni server Apache, ma potrebbe per vari motivi essere stato disabilitato in fase di installazione e quindi non funzionare correttamente.

Quindi, in tal caso, per ovviare a tale problema portatevi nella directory di installazione di Apache, qui è presente una directory di configurazione del server denominata conf al suo interno aprite il file httpd.conf che il file in cui vengono richiamati i moduli del web server e verificate che sia presente la chiamata al mod_rewrite e che non sia commentata con il simbolo #, nel caso eliminatelo e salvate il file, ricordate di arrestare apache e riavviarlo per rendere effettiva tale direttiva, a dimenticavo verificate anche che effettivamente sia presente il modulo che dovrebbe essere situato sempre nella root del web server nella directory modules.

Verificato che il modulo rewrite di apache è correttamente configurato, la prima cosa da fare è creare il vostro htaccess nella root del vostro sito e inserire la direttiva che lo attiva che è a seguente:

RewriteEngine On

Il funzionamento di questo modulo è semplice per lo scopo che ci siamo prefissi, in quanto basterà scrivere una serie di direttive RewriteRule consecutive con la seguente sintassi:

RewriteRule URL_CON_ESPRESSIONE_REGOLARE Nuovofile [FLAG,FLAG]

Il modulo leggerà tali direttive consequenzialmente e nè testa le espressioni eseguendone le trasformazioni indicate, i FLAG servono per modificare i comportamenti ma vedremo dopo in che modo.

Le Espressioni Regolari valide per il mod_rewrite sono quelle standard valide per molti altri linguaggi di programmazione.

Innanzitutto, per inizializzare il file indichiamo la root del sito, quindi inserite dopo l’istruzione di inizializzazione del modulo rewrite, la seguente direttiva:

RewriteBase /

che sta ad indicare al modulo rewrite di trasformare le URL dal nome dominio in avanti.

Poi si indicano in sequenza una serie di regole tramite la direttiva RewriteRule, servendosi della sintassi Regular Expression, per chi non conoscesse in maniera approfondità, queste potenti espressioni di manipolazione delle Stringhe, vi indico alcune delle principali regole sintattiche, iniziamo con i caratteri jolly che vi serviranno per modificare le vostre URL:

  • ^ indica l’inizio dell’URL
  • $ indica la fine dell’URL
  • . indica un qualsiasi carattere
  • | indica una scelta tra il carattere (o gruppo di caratteri) presente a sinistra e quello a destra (esempio it|en indica il carattere “it” o il carattere “en”)

Vi faccio un esempio pratico in modo che possiate meglio comprendere quanto precedentemente descritto:

RewiteRule    ^(inizio URL)http://vostrosito/(it|en)/(qualsiasi nome pagina).html$(fine URL)

È possibile indicare insiemi di caratteri cercati inserendoli all’interno di parentesi quadre:

  • [abc] indica la presenza di un carattere a scelta tra “a”, “b” e “c”
  • [^abc] indica la presenza di un qualsiasi carattere tranne “a”, “b” o “c” (tra parentesi quadre il carattere di accento circonflesso “^” non assume più il significato di inizio dell’URL ma di negazione dell’intera classe)
  • [a-d] indica la presenza di un carattere da “a” fino a “d”, quindi “a” o “b” o “c” o “d”. Questa notazione ci tornerà comoda per indicare un qualsiasi numero.

Ovviamente è possibile combinare gli insiemi con gli indicatori di quantità come ad esempio [0-9]+ per indicare uno o più cifre.

Detto ciò, cerchiamo di focalizzare l’attenzione, sul punto fondamentale di questo modulo che sta nel travasare parte di una Stringa nel nostro caso l’URL fittizio all’URL reale che viene eseguito dal web server.

Il risultato finale si ottiene indicando nell’indirizzo fittizio tra parentesi tonde ( ) l’espressione regolare che poi sarà recuperata nella composizione dell’indirizzo reale.

Vediamo un semplice esempio di quanto descritto:

URL da trasformare: http://giovannimasucci.it/en/index.html

URL reale:  http://giovannimasucci.it/index.php?lang=en

RewriteRule ^(it|en|fr|de|ru)/index.html$ index.php?lang=$1 [L]

Quindi viene indicata la URL reale e al suo interno dinamicamente il valore la parte intercettata dell’espressione regolare con il simbolo didollaro “$” seguito da una cifra numerica che indica la sua posizione.

Infine come precedentemente accennato con l’ultimo parametro il FLAG possiamo modificare il funzionamento del mod_rewrite. Vanno indicate tra parentesi quadre e separati da virgole, come possiamo osservare nell’esempio precedente. Ecco le principali:

[L]:  Si usa nel caso in cui l’URL trasformato non deve subire ulteriori trasformazioni per evitare che Apache consumi risorse di sistema inutilmente.

[QSA]: Si usa per aggiunge all’URL reale la query string presente al livello della finta URL. Molto utile per portarsi dietro contenuti appesi in query string o anche variabili di cui non avevamo tenuto conto.

[NC]: valuta l’espressione regolare senza tenere conto di maiuscole o minuscole.

[C]: lega la corrente direttiva alla successiva facendole terminare correttamente entrambe o non applicandone nessuna.

URL da trasformare: http://www.giovannimasucci.it/it/blog/social_marketing/e-commerce/magento.html

approfondimento.php?lang=$1&idcontenuto=$2 [L]

URL reale:http://www.giovannimasucci.it/blog/index.php?lang=it&cont=social_marketing/e-commerce/magento.html

RewriteRule ^(it|en|fr|de|ru)/([^/]+)\.html$ /blog/index.php?lang=$1&cont=$2 [L, QSA, NC]

Un’altro esempio per recuperare un file ordinato numericamente:

URL da trasformare: http://dominio/docs/52-Nome-del-documento.pdf
URL reale: /docs/52.pdf

RewriteRule ^/docs/([0-9]+)(\.[a-z]{3,4}) /docs/$1$2 [L,QSA,NC]

Oppure se si vuole mascherare per ragione di sicurezza il linguaggio di programmazione utilizzato:

URL da trasformare: http://dominio/script.py?id=12
URL reale: /script.php?id=12

RewriteRule ^/(.+)\.py(.+)? /$1.php$2 [L,QSA,NC]

Questa regola ci permette di mascherare l’uso di PHP facendolo sembrare un altro linguaggio di programmazione lato server, Python in questo esempio.

Spero che in seguito a questo articolo, siete riusciti ad avere maggiore confidenza sia con le funzionalità base di questo importante modulo di Apache che con la fondamentale potenza delle regular expression, presente in vari linguaggi di programmazione.

Nel caso vorreste approfondire ulteriormente l’argomento contattatemi pure al mio indirizzo di posta info@giovannimasucci.it, sarò lieto di aiutarvi.

Intanto vi saluto e vi dò appuntamento al prossimo articolo.

Un saluto

Giovanni Masucci

Be Sociable, Share!

6 pensieri su “Trasformare le URL rendendole SEO friendly per i Motori di Ricerca.

  1. ciao Giovanni,
    ho provato a smanettare con il codice che hai creato tu: sono arrivato, alla fine, a questo risultato:

    Options +FollowSymLinks
    IndexIgnore */*
    RewriteEngine on
    RewriteBase /
    RewriteRule ^collezione/modello/([a-zA-Z/s]*)/$ collezione_temi.php?m=$1 [L]

    Ho sostituito [R] con [L], per evitare i problemi di “internal server error pero’ mi manca la visualizzazione SEO friendly nell’url durante la navigazione.
    Sapresti aiutarmi??

    PS: grazie ancora per il supporto che mi hai dato via skype!

    1. Salve Roberto,
      ti ringrazio per il tuo commento e per i ringraziamenti, sono stato lieto di darti una mano per risolvere il tuo problema.
      Purtroppo come ti dicevo tramite Skype non ho una risposta immediata alla tua problematica, perchè bisognerebbe creare una strategia di routing all’interno di un Framework ben più complessa del semplice rewrite url.
      Comunque provvederò a studiare bene il quesito da te posto per trovare una soluzione più immediata.
      Comunque ti darò conferma in merito appena possibile.
      Un saluto è ti ringrazio per avermi seguito.

      Giovanni Masucci

  2. Ciao Giovanni, grazie ancora per l’aiuto che mi dai.
    Volevo sottoporti un altro quesito: credo e spero sia piu’ semplice del precedente…

    ho creato un sito web statico (no database) multilingua, http://www.badiaamontemuro.it, dove passo, tramite il parametro lang, la lingua prescelta (es: nomepagina.php?lang=it).

    Vorrei ottenere come risultato http://www.badiaamontemuro.it/it/nomepagina/
    e poter poi navigare mantenendo la stessa struttura nelle altre pagine.

    Al click della bandierina (ita – eng) dovrà cambiare solo il parametro query string, giusto?

    Grazie ancora,
    Roberto

    1. Ciao Roberto, grazie a te per me è un piacere darti una mano quando è possibile.
      Ho letto la tua soluzione che hai individuato per la rewrite rule è mi sembra corretta

      URL da trasformare: http://giovannimasucci.it/en/index.html

      URL reale: http://giovannimasucci.it/index.php?lang=en

      RewriteRule ^(it|en|fr|de|ru)/index.html$ index.php?lang=$1 [L]‏

      Il risultato l’ho visto dal sito che funziona correttamente, purtoppo non ho potuto visionare il sorgente perchè lo hai disabilitato.

      Se vuoi puoi spiegare a tutti i lettori come hai risolto il problema dell’url seo che avevi riscontrato.

      Un saluto Giovanni

      io

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *