- Home
- Categorie
- Digital Marketing
- Posizionamento Nei Motori di Ricerca
- Rimuovere query string e redirect 301 con .htaccess e mod_rewrite
-
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.htmlEsempio con i vini:
... / bianchi-falanghina-beneventano.html
... / bianchi-verdicchio-castelli-jesi.html
... / rossi-barolo.htmlCASO 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.htmlNon 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.htmlSe 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.htmlIl 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.htmlSe vuoi essere aiutato con le regex indica esattamente cosa vuoi ottenere.
Spero di esserti stato d'aiuto.
Francesco
-
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.htmlho 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!
-
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.htmlnomecategoria|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.
Francesco
-
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.25Ho 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 funzionaRingrazio in anticipo e mi scuso se mi sono dilungato
-
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
-
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"
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.
-
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).
-
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!
-
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 tipoindex.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
-
ci sono quasi riuscito...
con il seguente codice riesco ad indirizzare verso la pagina ricostruitaRewriteCond %{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 risultatolibri-by/id/1.html?ub=item&id=1
io invece vorrei soltato
libri-by/id/1.html
dove sbaglio?
grazie
-
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]
-
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
-
Ottimo, grazie del contributo.
-
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.htmlVorrei 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?
-
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 stringaRewriteEngine 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.