Rimuovere pagine duplicate da VirtueMart

VirtueMart è un componente aggiuntivo Open Source per Joomla che permette di installare sul vostro sito web un carrello elettronico, in modo da realizzare un vero e proprio eCommerce con il vostro sito Joomla.

Virtue Mart, sebbene sia gratuito, è un componente molto complesso e a mio avviso completo, in continua evoluzione grazie alla vasta comunità di sviluppatori ed utilizzatori che ne sono interessati.

A livello SEO però VirtueMart ha dei grandissimi problemi, almeno per quanto riguarda le versioni da me testate: VirtueMart crea un numero spropositato di pagine duplicate, problema molto grave per chi guarda al proprio sito internet nell’ottica del posizionamento sui motori.

Nel sito oggetto di studio (Veramente Naturale, negozio di cosmetici naturali) sono stati innanzitutto abilitati gli URL SEF nel pannello di controllo di Joomla agganciando VirtueMart all’url /shop : le pagine duplicate erano esattamente quelle riportate qui sotto. Il cliente aveva inoltre creato manualmente dei link invertendo l’ordine dei parametri della query string, in modo che vi fossero ulteriori versioni duplicate con i parametri invertiti.

Per capire subito di cosa parliamo, vi propongo un esempio concreto di come VirtueMart crea pagine duplicate, ovvero molte versioni identiche dello stesso prodotto

<ol>
    <li><em>/index.php?option=com_virtuemart&amp;page=shop.browse&amp;category_id=29&amp;lang=it&amp;Itemid=233&amp;vmcchk=1</em></li>
    <li><em>/index.php?option=com_virtuemart&amp;page=shop.browse&amp;category_id=29&amp;lang=it&amp;Itemid=233</em></li>
    <li><em>/index.php?option=com_virtuemart&amp;page=shop.browse&amp;category_id=29&amp;lang=it</em></li>
    <li><em>/index.php?option=com_virtuemart&amp;page=shop.browse&amp;category_id=29</em></li>
    <li><em>/shop?page=shop.browse&amp;category_id=29&amp;lang=it&amp;Itemid=233&amp;vmcchk=1</em></li>
    <li><em>/shop?page=shop.browse&amp;category_id=29&amp;lang=it&amp;Itemid=233</em></li>
    <li><em>/shop?page=shop.browse&amp;category_id=29&amp;lang=it</em></li>
    <li><em>/shop?page=shop.browse&amp;category_id=29</em></li>
</ol>

Come potete vedere, VirtueMart crea per la stessa pagina 8 versioni identiche. Sebbene Google sia in grado di stabilire se i parametri della query string siano necessari o no per identificare univocamente la pagina, alcune varianti duplicate restano, e la nostra pagina risulta di scarso valore agli occhi dei motori di ricerca.

Vi sono alcune soluzioni per ovviare al problema: la prima comporta l’installazione di plugin aggiuntivi per Joomla che sono in grado di trasformare VirtueMart nella versione con URL SEF , la seconda richiede la modifica del file .htaccess per rimuovere la maggior parte delle pagine duplicate grazie all’utilizzo dei redirect permanenti (redirect 301 di mod_rewrite di Apache).

1- Utilizzo di plugin SEF di Joomla

sh404SEF è a detta di molti esperti il migliore plugin SEF per VirtueMart. Personalmente preferisco evitare l’utilizzo di plugin esterni e limitarmi al core SEF di Joomla, pertanto passerò alla seconda soluzione, quella ingegneristicamente più interessante, molto difficile da trovare sul web.

2- Modifica del file .htaccess e mod_rewrite

La soluzione che proporrò nelle prossime righe è altamente complessa ed è intesa unicamente ad offrire spunti a chi già conosce .htaccess e mod_rewrite.

In questo caso gli URL di VirtueMart non sono veri e propri URL SEF, dal momento che permangono alcuni parametri nella query string. Tuttavia ho personalmente riscontrato ottimi risultati a livello SEO anche senza gli URL SEF su virtuemart, dunque rimango del parere che sia meglio affidarsi al proprio ingegno per risolvere un problema di duplicazione delle pagine piuttosto che affidarsi a plugin che non conosciamo.

Iniziamo a vedere le righe di codice da inserire nel file .htaccess per rimuovere alcuni dei parametri della query string non necessari. Dopo il codice cercherò di spiegare il significato delle istruzioni, numerate da 1 a 9 per comodità.

<ol>
    <li><em>RewriteEngine On
</em></li>
    <li><em>RewriteCond %{QUERY_STRING} (.*)(^Itemid=[a-zA-Z0-9]+&amp;?|^&amp;Itemid=[a-zA-Z0-9]+&amp;|&amp;Itemid=[a-zA-Z0-9]+)(&amp;?.*)</em></li>
    <li><em>RewriteRule (.*) %{REQUEST_URI}?%1%3 [L,R=301]</em></li>
    <li><em>RewriteCond %{QUERY_STRING} (.*)(^lang=[a-zA-Z0-9]+&amp;?|^&amp;lang=[a-zA-Z0-9]+&amp;|&amp;lang=[a-zA-Z0-9]+)(&amp;?.*)</em></li>
    <li><em>RewriteRule (.*) %{REQUEST_URI}?%1%3 [L,R=301]</em></li>
    <li><em>RewriteCond %{QUERY_STRING} ^(.+&amp;)option=com_virtuemart(.+)?$ [NC]</em></li>
    <li><em>RewriteRule ^index\.php$ http://%{HTTP_HOST}/shop$1?%1%2 [R=301,L]</em></li>
    <li><em>RewriteCond %{QUERY_STRING} ^(.+&amp;)?option=com_virtuemart&amp;(.+)?$ [NC]</em></li>
    <li><em>RewriteRule ^index\.php$ http://%{HTTP_HOST}/shop$1?%1%2 [R=301,L]</em></li>
</ol>

Vediamo il significato di ogni istruzione.

  1. RewriteEngine On
    Indica a Apache di utilizzare mod_rewrite per la riscrittura degli URL
  2. RewriteCond %{QUERY_STRING} (.*)(^Itemid=[a-zA-Z0-9]+&?|^&Itemid=[a-zA-Z0-9]+&|&Itemid=[a-zA-Z0-9]+)(&?.*)
    Ricerca all’interno della query string la stringa Itemid= , inutile utilizzando VirtueMart con URL SEF
  3. RewriteRule (.*) %{REQUEST_URI}?%1%3 [L,R=301]
    Rimuove la stringa cercata dall’URL con un redirect permanente
  4. RewriteCond %{QUERY_STRING} (.*)(^lang=[a-zA-Z0-9]+&?|^&lang=[a-zA-Z0-9]+&|&lang=[a-zA-Z0-9]+)(&?.*)
    Ricerca la stringa lang= nella query string, aggiunta dal plugin Joomfish non in uso
  5. RewriteRule (.*) %{REQUEST_URI}?%1%3 [L,R=301]
    Rimuove la stringa cercata dall’URL con un redirect 301 permanente
  6. RewriteCond %{QUERY_STRING} ^(.+&)option=com_virtuemart(.+)?$ [NC]
    Ricerca la stringa option=com_virtuemart in mezzo o alla fine della query string
  7. RewriteRule ^index\.php$ http://%{HTTP_HOST}/shop$1?%1%2 [R=301,L]
    Sostituisce la stringa option=com_virtuemart con /shop e rimuove /index.php, utilizzando un 301 permanent redirect
  8. RewriteCond %{QUERY_STRING} ^(.+&)?option=com_virtuemart&(.+)?$ [NC]
    Ricerca la stringa option=com_virtuemart all’inizio della query string
  9. RewriteRule ^index\.php$ http://%{HTTP_HOST}/shop$1?%1%2 [R=301,L]
    Sostituisce la stringa index.php?option=com_virtuemart con shop, usando un redirect 301

Ci tengo a sottolineare che questa soluzione va adattata alle vostre esigenze, e che non basta un copia-incolla per risolvere il vostro problema delle pagine duplicate su VirtueMart.

Grazie a tutti questi rewrite riusciamo così a passare dall’url /index.php?option=com_virtuemart&page=shop.browse&category_id=29&lang=it&Itemid=233 all’url /shop?page=shop.browse&category_id=29

Consiglio ai non esperti di prestare grande attenzione nella modifica di .htaccess: invece di rimuovere pagine duplicate, rischiate seriamente di introdurne di nuove e, soprattutto, di compromettere le funzionalità di VirtueMart.

One thought on “Rimuovere pagine duplicate da VirtueMart

  1. Ciao Matteo,
    complimenti per l’articolo.
    Peccato che non sono un’esperto a fare queste modiche da te desctitte per le pagine duplicate in virtuemart…. quindi ho un pò paura di fare danni.
    Volevo chederdti un consiglio:
    io uso sh404sef commerciale e sto avendo un pò di problemi con il tanto amato google.
    Il mio problema e che google mi trova delle pagine duplicate con questa sequnza: page 1/2.html – page 3/4.html ecc. ora queste pagine le vede come errore 404.
    Vorrei capire come potrei nascondere o cancellare queste pagine a finchè google non le veda più.
    Sapresti darmi un consiglio per poter risolvere questo problema?
    Grazie

  2. Purtroppo con il file Robots.txt non è attualmente possibile utilizzare dei pattern per bloccare i motori di ricerca dall’accedere a determinate pagine, quindi l’unica soluzione che mi viene in mente è l’utilizzo dei redirect per “nascondere” queste pagine duplicate o non trovate.
    Per poterti dare qualche spunto dovrei però capire esattamente di che si tratta.
    Potresti inserire qualche pagina di esempio?

  3. Grazie sei un grande!!!
    Erano settimane che ci sbattevo la testa. In pratica l’ho utilizzato su WordPress modificando .htaccess per redirect delle pagine dinamiche che mi aveva creato un plugin per le traduzioni.

    Dopo aver disinstallato questo plugin mi rimanevano nell’indice di Google moltissime pagine con “?lang=” creando una catastrofe di meta e contenuti duplicati. Ho scritto semplicemente:

    # BEGIN lang redirect

    RewriteEngine on
    RewriteCond %{QUERY_STRING} (.*)(^lang=[a-zA-Z0-9]+&?|^&lang=[a-zA-Z0-9]+&|&lang=[a-zA-Z0-9]+)(&?.*)
    RewriteRule (.*) %{REQUEST_URI}?%1%3 [L,R=301]

    # END lang redirect

    Un saluto

  4. È sempre bello sapere di esser stati utili!!

    In ogni caso ora su Google Webmaster Tools è presente una sezione per la configurazione dei parametri dinamici.

    Nel tuo caso potevi selezionare il parametro lang e dire a googlebot di non scansionare nessun url.

    Ottima opzione per GWT ma non sempre funziona a dovere….

  5. Purtroppo è un mese che è selezionata la rimozione dai parametri url… ma Google continua a tenere le pagine indicizzate. Con questo redirect 301 credo di aver risolto… aspettiamo un paio di settimane e speriamo :-)

    Nel frattempo ho aggiunto il canonical

    Grazie ancora!

Lascia un commento

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