.htaccess query string

Cambiamo direzione alle nostre URL con htaccessOggi argomento un po’ sistemistico e un po’ SEO: la riscrittura di vecchie URL. Precisamente come fare per passare da vecchie url con i parametri dopo il ? nell’url alle famose URL parlanti, ovvero quegli indirizzo che non c’hanno il ?.

Facciamo un passo indietro tanto per spiegare qualche concetto partendo dall’inizio:

  1. https://blog.merlinox.com/android-sms-su-gmail/ è un URL (Uniform Resource Locator) ovvero un indirizzo internet, a volte chiamato anche URI (Uniform Resource Identifier)
  2. http://it.bing.com/search?q=merlinox è un URL, ma in questo caso c’è ?. Il simbolo puntointerrogativo indica che quello che segue sono dei parametri. La loro sequenza è chiamata query string. In questo caso la pagina è:
    http://it.bing.com/search
    mentre il parametro è uno solo e si chiama “q” il cui valore è “merlinox”. I parametri possono essere  letti da linguaggi di programmazione server side (asp, php, coldfusion, jsp…) ed essere usati da routine di programmazione per produrre il risultato finale HTML.
  3. http://it.bing.com/search?q=merlinox&qs=n come sopra, però ci sono 2 parametri, il cui separatore è &:
    q=merlinox 
    qs=n
  4.  https://blog.merlinox.com/android-sms-su-gmail/ è una URL parlante. Infatti la stringa “android-sms-su-gmail” verrà interpretata (in questo caso da WordPress-Apache), processata e andrà a dire al CMS di pubblicare quel determinato articolo, tramite una interrogazione su database.

Detto questo può nascere l’esigenza, per fini estetici e per miglioramento del CTR in SERP, di convertire siti che hanno URL con query string, in URL parlanti. Esigenza che può nascere anche nel caso di rinnovo del sito e necessità di creazione di redirect. Ecco come fare: prendo spunto da alcuni esempi tratti dal sito mixeduperic.com.

Esempi .htaccess RewriteCond

Voglio convertire l’URL:
http://website.com/index.php?option=com_content&task=view&id=71&Itemid=52
in
http://website.com/i-love-Linux.html
In questo caso ho una conversione di tipo 1 a 1, ovvero un preciso valore di query string corrisponde ad una unica pagina.

La regola necessaria sarà:
RewriteCond %{REQUEST_URI} /index\.php
RewriteCond %{QUERY_STRING} option=com_content&task=view&id=71&Itemid=52
RewriteRule ^(.*)$ http://website.com/i-love-Linux.html? [L,R=301]

Se invece volessi convertire l’URL
http://website.com/index.php?id=71&Itemid=52
in
http://website.com/products/71/52/
Come devo fare? La regola sarà:

RewriteCond %{REQUEST_URI} /index\.php
RewriteCond %{QUERY_STRING} id=(\d+)&Itemid=(\d+)
RewriteRule ^(.*)$ http://website.com/products/%1/%2/? [L,R=301]

Tutto chiaro? %1 è la prima definizione di sottostringa nel RewriteCond, %2 la seconda. Il ? prima di [L,R=301] indica il termine dell’URL. Ma se l’ordine dei parametri non fosse esatto? Siete proprio insaziabili:

RewriteCond %{REQUEST_URI} /index\.php
RewriteCond %{QUERY_STRING} id=(\d+) [OR]
RewriteCond %{QUERY_STRING} Itemid=(\d+)
RewriteRule ^(.*)$ http://website.com/products/%1/%2/? [L,R=301]

Piccola nota: da inserire tra le quadre finali del RewriteRule ci sono due parametri che si chiamo QSA e QSD. QSA segnala di appendere i parametri di query string dopo l’URL. QSD (presente solo da Apache 2.4.0 in poi) segnala invece di scartare i parametri. Ricordatevi comunque che se inserite alla fine dell’URL di destinazione ? troncherete i parametri.

Ancora non vi basta? Andate a fare visita agli indiani o provate a usare i commenti!

ps: dal punto di vista SEO non vi è differenza tra URL con parametri e URL parlanti. Cambia però l’appeal verso gli utenti che devono leggere l’URL in SERP!!!

Loading Facebook Comments ...

13 pensieri su “.htaccess query string

  1. flavius

    grazie mille per questo magnifico post 😉
    ha più di 5 righe =))=))

    scherzi a parte mi hai aperto gli occhi su una cosa molto bella e utile… vediamo di metterla in pratica e vedere che cosa ne esce 😀

    ps. va tra i preferiti questo post 😀

    Rispondi
    1. Merlinox Autore articolo

      Sono quei post che praticamente rappresentano i miei appunti: altrimenti perdo tutto, ovviamente il problema è che perdo la memoria. Quindi so che se scrivo merlinox htaccess query string lo ritrovo…

      Rispondi
      1. flavius

        allora è un’ottima idea la tua quella di condividere con noi, questi appunti…

        devo dire che adesso ho capito molto meglio questo discorso…

        già che ci sono e voglio vedere se ho capito bene….
        quindi se io ho in questo momento questo URL:
        http://ilmiosito/viewtopic.php?f=80&t=2054
        e lo volessi trasformare in:
        http://ilmiosito/areax/80/2054/

        mi basta fare solo:
        RewriteCond %{REQUEST_URI} /index\.php
        RewriteCond %{QUERY_STRING} id=(\d+)&Itemid=(\d+)
        RewriteRule ^(.*)$ http://ilmiosito/areax/%1/%2/? [L,R=301]

        oppure devo modificare anche la => id=(\d+)&Itemid=(\d+) ???

        Rispondi
        1. Merlinox Autore articolo

          @flavius: ma per chi mi hai preso… mica le so quelle cose lì… 😉 Attento che col tuo rewritecond vai ad imporre una sequenza di parametri fissa…

          Rispondi
          1. flavius

            bhe ti ho preso per uno che ne sa più di me sicuramente 😀

            ok farò attenzione e un paio di prove, per vedere che cosa ne esce fuori 😀

            Rispondi
  2. Andrea Cardinali

    Ciao Merlinox, mi permetto di puntualizzare quanto scritto da te sopra, in quanto c’è un informazione “nascosta” 🙂
    Per ignorare la query string in Apache <2.4 è sufficiente aggiungere un ? (punto interrogativo) nella destinazione del redirect.
    Ovvero in questo esempio :
    RewriteCond %{REQUEST_URI} /index\.php
    RewriteCond %{QUERY_STRING} id=(\d+)&Itemid=(\d+)
    RewriteRule ^(.*)$ http://website.com/products/%1/%2/? [L,R=301]
    il punto interrogativo elimina la query string

    Ottimo articolo!

    Rispondi
  3. Imma Califano

    Ciao Riccardo,
    ottimi appunti, ti posso chiedere il prestito il quaderno, mi faccio qualche fotocopia ? 🙂

    Ecco la mia variante all’esercizio di oggi:
    RewriteCond %{REQUEST_URI} /index\.php
    RewriteCond %{QUERY_STRING} view=article&id=(169|170|171|173|174|175|168|177|180|182|202|184|201)&Itemid=(\d+)
    RewriteRule ^(.*)$ http://www.miostio.com/en/%1.html? [L,R=301]

    Rispondi
    1. Merlinox Autore articolo

      Mi pare Imma che non faccia una piega. L’unica cosa è valutare se analizzare il querystring ricercando proprio quella forma completa con i 3 parametri, o se valga la pena verificare solo “id”.

      Rispondi
      1. Imma Califano

        Considerando la complessità del sito su cui sto lavorando ho preferito mettere più condizioni possibili, ma in effetti l’ultimo potrei anche toglierlo visto che non lo utilizzo successivamente

        Rispondi
  4. Marco

    Ciao Merlinox,
    confido in te 🙂 ho un problema di redirect per un e-commerce in restyling.
    Praticamente le URL vecchie erano così:
    http://www.sitoweb.ext/cartella1/cartella2/index.aspx?a=12&b=34&c=56
    mentre il nuovo URL corrispondente è del tipo:
    http://www.sitoweb.ext/nuovacartella

    Ho provato a passarle così: (ma non ha funzionato)
    RewriteCond %{REQUEST_URI} /index\.aspx
    RewriteCond %{QUERY_STRING} a=12&b=34&c=56
    RewriteRule ^(.*)$ http://www.sitoweb.ext/nuovacartella? [L,R=301]

    Le ho provate tutte (tranne quella giusta evidentemente 🙂
    Hai qualche consiglio? Grazie mille!!!

    Rispondi
  5. Abbasi

    question: what if I am the store/website owner who knows just enough to hurt mlysef? ex: I moved my domain, http://www.abeautifullife.com, to a new hosting environment and all is well, EXCEPT my old host has the homepage default thusly: http://www.abeautifullife.com/beautifulso now any of my 10,000 customers who go to their bookmark get a broken link!what to do? Is there an outside service that can redirect broken links in a catch-all’ manner from a specified domain for a fee?

    Rispondi

Lascia un commento

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