• Moderatore

    Rimuovere query string e redirect 301 con .htaccess e mod_rewrite

    Questo topic sulla rimozione delle query string via htaccess con il mod_rewrite ha origine da un altro topic incentrato su contenuti duplicati, rel = canonical e *redirect 301 *da fare su alcuni url di un sito in Joomla 2.5:

    http://www.giorgiotave.it/forum/joomla/218785-joomla-e-strumenti-per-i-webmaster-di-google-2.html

    Con le istruzioni RedirectMatch 301, usando una regex si sono redirezionati alcuni url generati dal com_content, mentre per gli url che includono una query string ho pensato di procedere sempre via htaccess, ma con *RewriteCond *e RewriteRule.

    Gli url da redirezionare sono quelli che hanno id articolo pari a 20, ad esempio questo:

    
    studiofontanabertoli.it/component/content/category/index.php?option=com_content&view=article&id=20:lo-staff&catid=13:team&Itemid=121
    
    

    Tutti gli url come questo sopra devono essere redirezionati a un url specifico:

    
    http://www.studiofontanabertoli.it/team.html
    
    

    Ci sono poi altri due url che vanno redirezionati permanentemente alla Home:

    
    studiofontanabertoli.it/component/content/
    studiofontanabertoli.it/component/content/?view=featured
    
    

    Le istruzioni da inserire nell'htaccess sono:

    
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/component/content/category/index\.php$
    RewriteCond %{QUERY_STRING} ^option=com_content&view=article&id=20(.*)$ 
    RewriteRule ^(.*)$ http://www.studiofontanabertoli.it/team.html? [R=301,L]
    
    
    RewriteCond %{REQUEST_URI} ^/component/content/$
    RewriteCond %{QUERY_STRING} ^(view=feature)?$ 
    RewriteRule ^(.*)$ http://www.studiofontanabertoli.it? [R=301,L]
    
    

    dove la riga del RewriteEngine On va inserita soltanto se non è già presente.

    Ho dovuto fare un po' di prove per essere certo di includere tutti e soli gli url desiderati. Fatemi sapere se condividete le scelte, se ho sbagliato oppure se esiste magari un modo alternativo più efficiente.

    • Nella prima RewriteCond della query string mi sono preoccupato di individuare la vista articolo con id=20, però ho ipotizzato che la query string potesse anche essere più lunga (con altri parametri).
    • Sempre nel primo blocco, alla fine dell'url di destinazione nella RewriteRule ho inserito un "?" (punto interrogativo) per troncare l'url in quel punto, altrimenti mi si attaccava la parte con i parametri.
    • Nel secondo blocco, infine, la RewriteCond sulla query string include le due opzioni "con e senza", in modo da non dovere creare due diverse istruzioni.

    Adesso aspettiamo che PietroR ci dia conferma della bontà della soluzione sul suo sito. Le istruzioni, opportunamente modificate, valgono non soltanto per Joomla ma per qualunque sito (su Apache con .htaccess) per il quale occorra inserire redirect 301 eliminando le query string.

    *Francesco *:smile5:


  • User

    Buongiorno francesco,

    grazie per le tue indicazioni.
    volevo chiederti una piccola variante:

    avrei la necessità di reindirizzare da /cartella-variabile/nomearticolo.html a nomearticolovariato.html

    come posso adattare il codice da te proposto?
    ho provato in diversi modi, ma senza buon esito

    grazie anticipatamente

    enrico


  • User

    ne approfitto

    se riuscissi a trovare una espressione per trasformare tutti gli indirizzi di questo tipo

    /nome-cartella-variabile/01-nome-articolo.html

    in

    /nome-articolo.html

    dove /nome-cartella-variabile/ è sempre diverso, così come è sempre diverso 01 (potrebbe essere 02, 30, 50, ecc...)

    un po' quello che richiamano anche qua giorgiotave.it/forum/mod-rewrite-e-tecniche-di-url-redirect/210453-redirect-301-htaccess-passando-da-joomla-wordpress-regex.html

    (tipico dei passaggi da joomla a wordpress)


  • Moderatore

    Ciao tordosordo.
    Il redirect da vecchia_url a nuova_url richiede l'esistenza di una corrispondenza univoca, tale cioè che ad ogni vecchia url sia associata una sola nuova url. In realtà la corrispondenza da stabilire è biunivoca se ciascuna delle vecchie url si riferisce ad una pagina diversa.

    Per l'automazione occorre quindi individuare una regola che associ ad ogni vecchia url la corrispondente nuova url.
    Una tale regola deve necessariamente tenere conto di entrambe le strutture: quella delle vecchie url (sulla quale non possiamo scegliere) e quella delle nuove (che è quella che vogliamo ottenere).

    CASO 1.
    Hai un numero finito di percorsi del tipo [nome-cartella], ciascuno con più url come:
    ... / nome-cartella / pagina1.html
    ... / nome-cartella / pagina2.html
    ...
    Potresti ad esempio avere due percorsi:
    ... / bianchi / falanghina-beneventano.html
    ... / bianchi / verdicchio-castelli-jesi.html
    ... / rossi / barolo.html
    ...
    In questo caso (numero finito di percorsi) scrivi un'istruzione per ogni percorso.

    CASO 2.
    Hai un numero molto elevato di percorsi (per semplificare diciamo infinito), ciascuno con più url:
    ... / percorso1 / nomepagina1.html <--- stesso finale di url
    ... / percorso1 / nomepagina2.html
    ... / percorso1 / nomepagina3.html
    ... / percorso2 / nomepagina1.html <--- stesso finale di url
    ... / percorso3 / nomepagina4.html
    ...
    In questo caso non puoi enumerare i percorsi perché ne sono troppi e devi prevenire situazioni come quelle evidenziate dalle frecce, in cui la semplice eliminazione del "percorso" farebbe puntare due diverse vecchie url alla stessa nuova url (questo significa che, se stai redirezionando url tra loro diverse, la corrispondenza che dobbiamo stabilire sarà biunivoca).

    Per risolvere devi creare una regola che alla vecchia url:
    ... / percorso_i / nomepagina_j.html
    associ la nuova url:
    ... / i-nomepagina_j.html

    Esempio con i vini:
    ... / bianchi-falanghina-beneventano.html
    ... / bianchi-verdicchio-castelli-jesi.html
    ... / rossi-barolo.html

    CASO PRATICO.
    Vuoi realizzare una cosa simile a quella prospettata nel 3d che hai linkato, cioè vuoi passare dalle vecchie url:
    ... /category/34-subcategory/12-articolo-con-nome-lungo.html
    alle nuove url:
    ... /category/articolo-con-nome-lungo.html

    Non c'è automazione che tenga perché non c'è modo di garantire la biunivocità, ad esempio in questo caso:
    ... / category / 26-subcategory / 37-titoloarticolo.html
    ... / category / 33-subcategory / 64-titoloarticolo.html

    Se elimini sia la subcategory sia l'id dell'articolo è facile capire che le due vecchie url sopra (relative a pagine diverse) corrisponderanno a una stessa nuova url (!):
    ... /category / titoloarticolo.html

    Il problema lo risolvi se hai un numero limitato di redirect da fare, questo perché devi individuare i "titoloarticolo" uguali e cambiarli (nel nuovo sito). Per l'individuazione degli articoli "vecchi" puoi agire da database con una query (eventualmente puoi individuare pezzi di stringa identici aiutandoti con un foglio di calcolo o scrivendo uno script). Quando individui due "titoloarticolo" uguali, nella regex che scrivi inserisci una eccezione (cioè li elimini dalla regola), per poi aggiungere redirect singoli.

    Io però farei una cosa diversa. Per i vecchi articoli lascerei l'id univoco nell'url, che è la cosa più semplice e non credo comprometta più di tanto la friendly-tudine dell'url. In pratica trasformerei i due url sopra in:
    ... / category / 37-titoloarticolo.html
    ... / category / 64-titoloarticolo.html
    o addirittura in:
    ... / 37-titoloarticolo.html
    ... / 64-titoloarticolo.html

    Se vuoi essere aiutato con le regex indica esattamente cosa vuoi ottenere.

    Spero di esserti stato d'aiuto. 🙂
    Francesco


  • User

    ciao e grazie francesco,

    la necessità di trovare una regola generale viene proprio dal numero eccessivo di indirizzi da riscrivere. potrei farlo a mano, non è un problema, ma credo che inserire ulteriori 150/200 regole singole nel file htaccess lo appesantisca troppo

    analizzando i vari errori rilevati da gwt, noto che esistono link di questo tipo

    nomecategoria/27-nomearticolo.html
    nometag1/27-nomearticolo.html
    nometag2/27-nomearticolo.html

    ho pensato: visto che io devo reindirizzare tutto a

    nomearticolo.html

    potrei creare una o due regole di questo tipo

    vai da ***qualsiasicosacisiascritto/27-nomearticolo.html ***a nomearticolo.html

    in questo modo, credo che ridurrei le regole da scrivere da 150/200 a 20/30 .. decisamente meglio!

    quale sarebbe la regola da scrivere? io ho fatto un po' di prove con alcune regole trovate sui vari siti internet, ma nessuna ha funzionato

    ringrazio anticipatamente

    Enrico

    PS: non è indispensabile automatizzare l'eliminazione dell'id articolo, quindi se non è possibile con le regex, non c'è problema!


  • Moderatore

    Se parli di redirect 301 e non vuoi eliminare l'id articolo puoi provare così:

    
    RedirectMatch 301 /nomecategoria|nometag1|nometag2/(.*) http :// www . tuodominio . com /$1
    
    

    Questa regola va bene se prima di *nomecategoria *c'è solo il dominio, cioè va bene ad esempio per:
    http :// www . tuodominio . com / nomecategoria/pippo.html
    ma non va bene per:
    http :// www . tuodominio . com / qualcosa-prima / nomecategoria/pippo.html

    nomecategoria|nometag1|nometag2 -> sono le opzioni, significa che nell'url vecchio può starci una di queste tre cose (le opzioni le separi con il simbolo | ).

    Se vuoi tenere "category" puoi fare così:

    
    RedirectMatch 301 /category/nomecategoria|nometag1|nometag2/(.*) http :// www . tuodominio . com /category/$1
    
    

    Se vuoi eliminare la "category":

    
    RedirectMatch 301 /category/nomecategoria|nometag1|nometag2/(.*) http :// www . tuodominio . com /$1
    
    

    Ci potrebbero essere esigenze diverse, un po' più complicate. Se è così prova a postare un elenco di 5-10 url da reindirizzare, così gli utenti del forum hanno più info per aiutarti. :wink3:

    Francesco


  • User Newbie

    Buongiorno a tutti,
    sono nuovo di questo utilissimo forum e spero di postare nella sezione giusta....😊

    Mi accodo a questa discussione perché ho anch'io un problemino con la query string view=featured
    Premetto che ho un sito Joomla 2.5.25

    Ho seguito il preziosissimo suggerimento di FDA inserendo nel mio file .htacces la regola suggerita da FDA

    Ho aggiunto però la lettera d a view=featured altrimenti non mi funzionava.

    Risultato:
    le pagine con il percorso miosito.com /component/content e miosito.com /component/content/?view=featured vengono correttamente reindirizzate sulla home... e questo per me è già un bel risultato, fin qui tutto ok.

    Purtroppo però Google mi indicizza ancora la pagina miosito.com/?view=featured

    Non capisco il perché e soprattutto mi chiedo se proprio non ci sia modo di redirezionare anche questa...

    PS
    già provato con redirect nativo di Joomla e con ReDJ ma non funziona

    Ringrazio in anticipo e mi scuso se mi sono dilungato :gthi:


  • Moderatore

    Ciao fafy,
    la d mancante è un refuso, grazie per averlo evidenziato. 😉

    Per il tuo problema, aggiungi al tuo .htaccess:

    
    RewriteCond %{REQUEST_URI} ^/$
    RewriteCond %{QUERY_STRING} ^(view=featured)$ 
    RewriteRule ^(.*)$ http://miosito.com? [R=301,L]
    
    

    Controlla se ci sono problemi con lo slash finale, ma dovrebbe andare tutto bene.
    Considera che nell'htaccess conta anche la sequenza delle istruzioni, quindi se un'istruzione non funziona prova a inserirla prima di un blocco di istruzioni già presente.

    Aggiornaci per sapere se è andata bene. 🙂

    Francesco


  • User Newbie

    Ciao Francesco,
    grazie mille per la dritta, ho fatto come hai detto e funziona perfettamente! 🙂

    Scusa se ne approfitto, ma è un mese che sto letteralmente combattendo contro pagine duplicate e sitelink "a random" :arrabbiato:

    Ho notato appunto che nei site link Google si è messo, da qualche giorno, ad indicizzare una pagina con questa stringa:

    miosto.com/index.php/component/content/?view=featured

    che cosa mi suggeriresti di fare? Aggiungo una ulteriore regola all' .htacces?
    Una cosa del tipo:

    RewriteCond %{REQUEST_URI} ^/index.php/component/content/$
    RewriteCond %{QUERY_STRING} ^(view=feature)?$
    RewriteRule ^(.*)$ (acca ti ti pi://)miosito.com? [R=301,L]

    Mi sembra strano che nonostante abbia abilitato la riscrittura degli url, ancora vengano trovate pagine del tipo:

    miosto.com**/index.php/*** eccetera*

    Che ne pensi?

    Grazie ancora.


  • Moderatore

    Ciao fafy.
    Se Google ha scelto quell'url come sitelink c'è un motivo, probabilmente l'ha scelto seguendo un link, cosa che suggerisce due scenari:

    • Google ha individuato il link in precedenza, quando non era impostata la riscrittura friendly delle url dal pannello di Joomla!
    • Google ha seguito un link tuttora presente

    Ti consiglio di cercare il link nelle pagine (soprattutto in home page) guardando il sorgente per capire se ancora c'è quel link: se lo trovi puoi modificarlo in friendly url.
    Non aggiungerei una regola all'htaccess e non credo che serva un redirect 301, al più dovrebbe comparire un rel canonical verso la url canonica (che è appunto quella friendly).


  • User Newbie

    Ciao Francesco,
    ti ringrazio... ho controllato nel sorgente della home e il link con index.php non è presente; Probabilmente, come dici tu, è un link scovato da Google prima che venisse attivata la ri-scrittura degli url (infatti ho, da circa due mesi, rinominato htaccess.txt in .htacces)...
    Spero quindi che il problema si risolva da solo col tempo o che passando a Joomla 3 si riesca con il rel canonical ad ovviare a tutti questi problemi di duplicazione.
    Vi terrò aggiornati, intanto grazie ancora!


  • User Newbie

    ciao a tutti...
    spero di aver trovato il luogo della risposta!
    davvero nn riesco a capire cosa fare per risolvere il mio problema...
    ho cambiato linguaggio per un sito.
    sono passato da asp a php
    adesso grazie al file htaccess vorrei mantenere l'indicizzazione sui motori di ricerca sfruttando il
    rewriterule (mi pare) 301.
    il mio problema è che nn riesco a portare le variabili querystring
    il passaggio che vorrei ottenere è

    index.asp?ub=item&id=var1 in pagina1.php?id=var1

    index.asp?ub=var1&id=var2 in pagina2.php?ub=var1&id=var2

    ho fatto qualche tentativo ma ho ottenuto un redirect senza variabili.
    inoltre mi chiedevo se posso reindirizzare a qualcosa del tipo

    index.asp?ub=item&id=var1 in /categoria/var1

    sfruttando un reindirizzamento che mi riesce già
    spero davvero in un aiuto...
    nel frattempo vi ringrazio!
    ciao


  • User Newbie

    ci sono quasi riuscito...
    con il seguente codice riesco ad indirizzare verso la pagina ricostruita

    RewriteCond %{QUERY_STRING} ub=item&id=([^&]+)?
    RewriteRule ^index.asp /libri-by/id/%1.html [R=301,L]

    il problema è che oltre alla variabile che mi serve, ovvero "id", mi riscrive di seguito tutte le querystring
    ottenendo il seguente risultato

    libri-by/id/1.html?ub=item&id=1

    io invece vorrei soltato

    libri-by/id/1.html

    dove sbaglio?
    grazie


  • Moderatore

    Ciao gt_salvo e benvenuto sul Forum GT.
    Prova ad aggiugere il punto interrogativo al secondo url nel rewrite rule, qualcosa del genere:

    
    RewriteCond %{QUERY_STRING} ub=item&id=([^&]+)?
    RewriteRule ^index.asp /libri-by/id/%1.html? [R=301,L]
    
    

  • User Newbie

    grazie FDA per la risposta
    ho appena risolto ma in altro modo
    lo scrivo per utilità di altri capitati in questo stesso problema
    in pratica ho messo [301, QSD] alla fine
    QSD infatti toglie le query string che si porta dietro dalla regola
    grazie ancora


  • Moderatore

    Ottimo, grazie del contributo. 🙂


  • User

    Seguendo anche la vostra discussione sto cercando di risolvere quanto segue:

    ho degli articoli da componente duplicati del tipo
    sito/dirA/1-testo1-teston.html
    sito/dirB/1-testo1-teston.html
    sito/dirC/1-testo1-teston.html

    Vorrei reindirizzare il tutto in:

    sito/dirD/1-testo1-teston.html

    Ma devo condizionare il rewrite solo all'indirizzo che dopo la seconda dir inizia con un numero "sito/dirA/1-testo1-teston.html" quindi tranne sito/dirN/testo.html

    Ho provato quanto segue ma non ho risposte dal server

    RewriteCond %{QUERY_STRING} ^/([^/]+)/([0-9]+)-([^/]+)$
    RewriteRule ^/([^/]+)/([0-9]+)-([^/]+)$ accatitipi.sito.ext/dir/$2-$3 [R=301]

    non riesco proprio a risolvere ❌x come posso fare?


  • User Newbie

    Salve ragazzi ho un problema con il redirect e le query string.
    Vorrei reindirizzare le pagine di un vecchio sito alla nuova courtesy page temporanea
    in attesa di rifare daccapo il sito.
    Il problema è che i vecchi indirizzi sono di questo tipo "www-vinicolacherchi-it/vini.php?lang=it"
    quindi ho provato inserendo nel file htaccess questa stringa

    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/vini.php$
    RewriteCond %{QUERY_STRING} ^lang=it$
    RewriteRule ^(.*)$ nuovo link [L,R=301]

    ma non sembra funzionare.
    Suggerimenti? Dove sto sbagliando?

    facendo così perdo il posizionamento di queste pagine o no?
    Una volta rifatto il sito, quindi avendo nuovi indirizzi per quelle pagine,
    dovrò di nuovo impostare un r301?

    Grazie per l'aiuto.