Redirect Permanent di una query string

ApacheCambiando struttura del permalink mi sono ritrovato con la necessità di reindirizzare gli utenti senza causare innumerevoli errori 404.

Oltre questo, dovevo informare i motori di ricerca del cambiamento, in modo che sostituissero i vecchi link indicizzati con i nuovi.

Devo dire che Google in meno di 48 ore nelle ricerche mostrava già i nuovi permalink 🙂

Inizialmente ero orientato verso l’uso di RedirectMatch. Ma questo, pur supportando le espressioni regolari, non funziona bene con query string complesse.

Un’ottima alternative è usare il mod_rewrite. L’associazione delle direttive RewriteCond e RewriteRule rende impossibile sbagliare il ridirezionamento!

Vediamo un paio di esempi, usati proprio da questo blog.

La ridirezione dei permalink degli articoli prevedeva ci fosse una query string con l’elemento "articolo" come definizione di parametro.

Il vecchio permalink era: http://www.davidonzo.com/dblog/articolo.asp?articolo=300 (il 300 è solo di esempio e corrisponde all’id dell’articolo).

Il nuovo permalink corrispondente è http://www.davidonzo.com/post/300/.

Il primo problema mi è sorto dalla sottodirectory dblog, che nella nuova piattaforma non era prevista. Difatti ora tutto gira in root. Beh, poco male, per risolvere senza far troppo casino ho creato la directory dblog 🙂

In cima al file .htaccess è meglio aggiungere:

Options +FollowSymLinks

In modo che Apache segua i link simbolici. Di seguito abilitiamo l’uso del mod_rewrite per le direttive seguenti.

RewriteEngine On

Adesso definiamo a quali condizioni Apache debba riscrivere e reindirizzare il client che fa richiesta di una query string.

RewriteCond %{QUERY_STRING} ^articolo=(.*)$

Se l’URL richiesto è una query string ed alla fine di questo è presente il parametro "articolo=$qualcosa". Questo $qualcosa però è troppo generico. L’id dell’articolo è necessariamente un elemento numerico.

RewriteCond %{QUERY_STRING} ^articolo=([0-9])$

In questo modo diamo come condizione di riscrittura l’indicazione di id numerico.

Se Apache intercetta una richiesta corrispondente ai criteri esposti, deve reindirizzare il client riscrivendo la sua richiesta nel seguente modo.

RewriteRule ^articolo\.asp$ http://www.davidonzo.com/post/%1/?

Nella RewriteRule diamo una ulteriore indicazione per non sbagliare. Il parametro di riscrittura è dato dal file articolo.asp. E il client verrà reindirizzato al permalink nuovo.

Per arricchire di informazioni il rewrite e renderlo un redirect permanent aggiungiamo la seguente istruzione:

RewriteRule ^articolo\.asp$ http://www.davidonzo.com/post/%1/? [R=301,L]

Con R=301 inviamo lo status di redirect permanent. Nel caso in cui sia un motore di ricerca a finire su quel link, saprà che dovrà aggiornare i suoi archivi.

La L invece diciamo ad Apache di fermare qualsiasi altra istruzione di rewrite se questa è andata a buon fine.

L’esempio completo è il seguente.

Options +FollowSymLinks

RewriteEngine On

RewriteCond %{QUERY_STRING} ^articolo=(.*)$
RewriteRule ^articolo\.asp$ http://www.davidonzo.com/post/%1/? [R=301,L]

Capire ora perchè sono passato da IIS ad Apache? Come rinunciare a tanta duttilità!

6 thoughts on “Redirect Permanent di una query string”

  1. scusa ma non ti bastava aggiungere /dblog/ (escapato eventualmente) nella rewritecond per spostare tutto in root senza creare la cartella?

  2. ciao davidonzo,

    perchè io se scrivo questo

    RewriteCond %{QUERY_STRING} ^nomeprod=(.*)&product=([0-9])&catcode=([0-9])&t=(.*)&cat=([0-9])$

    RewriteRule ^/product1.asp$ pagina-prodotti.php?a=ok&id=%2&cat=%3? [L,R=301]

    non risolvo?

Comments are closed.