- Home
- Categorie
- Digital Marketing
- Posizionamento Nei Motori di Ricerca
- [htaccess] un paio di errori con redirect 301
-
[htaccess] un paio di errori con redirect 301
Buonasera.
Un cliente di vecchia data mi ha commissionato il restyling del sito che avevo realizzato alcuni anni fa.
Sebbene i contenuti siano bene o male gli stessi, la struttura del sito è leggermente cambiata e di conseguenza sono variati anche gli url delle singole pagine.
Per non perdere le posizioni guadagnate dalle attuali pagine ho ritenuto opportuno inserire, nel documento .htaccess, dei redirect 301 per "informare" Google dei nuovi url.Ho riscontrato due difficoltà:
la prima è che parecchi url contengono delle variabili e, da quel che ho visto, queste non vengono riconosciute nel documento .htaccess rendendo il redirect inefficace;
la seconda difficoltà è causata dal fatto che il programmatore che, all'epoca, si occupò della compilazione del codice ebbe la felicissima intuizione di utilizzare degli spazi vuoti in alcuni url.
Quindi adesso mi ritrovo con url come www.nomesito.ext/index.php?id=1& settore=ventilatori&pagina=1 con un simpaticissimo spazio dopo il primo "&". Come posso rendere questo spazio vuoto nella stringa del redirect?Grazie.
-
Ciao Eugene,
prova a seguire questa discussione e i link al suo interno.
-
Grazie Juanin,
avevo già visto alcune delle discussioni indicate ma ho preferito aprirne una nuova poiché sono totalmente inesperto per quanto riguarda l'url rewrite.
Ho compreso la "filosofia" che c'è dietro la realizzazione di quello di cui ho bisogno ma non ho le conoscenze adeguate per riuscirvi. Sostanzialmente non ho la più pallida idea del codice da compilare per il rewrite.
Per la cronaca, il vecchio sito era fatto interamente "a mano" mentre l'attuale utilizza un cms per il quale è già attivo l'url rewrite.
Non vorrei che il codice che vado ad inserire in .htaccess entrasse in conflitto con il codice del cms. Può verificarsi?
-
Che CMS usi?
Che .htaccess utilizza?
-
Cosa intendi dire, vuoi che posti il codice contenuto nell'.htaccess?
-
Comunque il CMS è OpenCart.
-
Sì posta il codice dell'htaccess.
-
# 1.To use URL Alias you need to be running apache with mod_rewrite enabled. # 2. In your opencart directory rename htaccess.txt to .htaccess. # For any support issues please visit: http://www.opencart.com Options +FollowSymlinks # Prevent Directoy listing Options -Indexes # Prevent Direct Access to files <FilesMatch "\.(tpl|ini|log)"> Order deny,allow Deny from all </FilesMatch> # SEO URL Settings RewriteEngine On # If your opencart installation does not run on the main web folder make sure you folder it does run in ie. / becomes /shop/ RewriteBase / RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap RewriteRule ^googlebase.xml$ index.php?route=feed/google_base RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css) RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] ### Additional Settings that may need to be enabled for some servers ### Uncomment the commands by removing the # sign in front of it. ### If you get an "Internal Server Error 500" after enabling any of the following settings, restore the # as this means your host doesn't allow that. # 1. If your cart only allows you to add one item at a time, it is possible register_globals is on. This may work to disable it: # php_flag register_globals off # 2. If your cart has magic quotes enabled, This may work to disable it: # php_flag magic_quotes_gpc Off # 3. Set max upload file size. Most hosts will limit this and not allow it to be overridden but you can try # php_value upload_max_filesize 999M # 4. set max post size. uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields # php_value post_max_size 999M # 5. set max time script can take. uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields # php_value max_execution_time 200 # 6. set max time for input to be recieved. Uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields # php_value max_input_time 200 # 7. disable open_basedir limitations # php_admin_value open_basedir none
Questo è il codice generato dal CMS e che funziona correttamente.
Avevo aggiunto la riga RewriteRule ^settore-([0-9]+).html$ categorie.php?id=$1 con l'intenzione di convertire gli url vvv.nomesito.com//dir/pagina.php?id=3 in vvv.nomesito.com//dir/settore-3.html ma non ho avuto alcun risultato.
La cosa che più mi preoccupa è che ci sono alcuni url con più variabili (es. vvv.nomesito.com/dir/ricerca.php?iddettaglio=10&idcategoria=15&idsottodettaglio=11&idscelta=2) e non ho la più pallida idea di come effettuare il rewrite.Grazie mille.
-
Ok.
L'.htaccess in questione non dovrebbe assolutamente andare in conflitto con i tuoi redirect custom.
Ovviamente come lo hai implementato tu non va bene perché in caso di query string devi utilizzare la sintassi che trovi nel post che ti ho linkato sopra già al secondo commento.
Il problema è tutto lì.Fammi sapere.
-
Innanzitutto grazie per la disponibilità e la pazienza, mi rendo conto che possa essere snervante ripetere sempre le stesse cose.
Ho (ri)letto le discussioni indicate ed a qualcosa sono arrivato, ma accade comunque ancora qualcosa di strano.Ho aggiunto il codice indicato a quello già presente in .htaccess:
RewriteBase / RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap RewriteRule ^googlebase.xml$ index.php?route=feed/google_base RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css) RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] RewriteCond %{REQUEST_URI} ^/dir/pagina\.php$ RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ RewriteRule ^(.*)$ http://vvv.nomesito.com/settore-%1 [R=301,L]
La cosa strana è che invece di ottenere vvv.nomesito.com/settore-x ottengo vvv.nomesito.com/settore-x?id=x.
Cosa ci fa ?id=x alla fine dell'url?
-
Bravissimo
Quello che devi fare per evitare questo è di aggiungere un ? alla fine della rewrite rule.
RewriteCond %{REQUEST_URI} ^/dir/pagina\.php$ RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ RewriteRule ^(.*)$ http://vvv.nomesito.com/settore-%1? [R=301,L]
-
Grazie!
Diciamo che un passo avanti adesso l'ho fatto ma non sono ancora arrivato alla soluzione del problema.
L'url generato dal rewrite non riporta più ?id=x alla fine, adesso però ottento un bel "pagina non trovata". E' ovvio che la pagina non venga trovata dal momento che non esiste, ma non è proprio questa la finalità dell'url rewrite ovvero riscrivere un url esistente in uno che di fatto non esiste?
Mi sfugge qualcosa...In questo contesto la cosa potrebbe interessarmi poco dal momento che il rewrite lo sto facendo solo per poter effettuare un redirect 301, cosa che di fatto riesco (quasi) ad ottenere aggiungendo, dopo il codice del rewrite, le seguenti righe:```
redirect 301 /settore-1 http://vvv.nomesito.com/settore/settore-pippo
redirect 301 /settore-2 http://vvv.nomesito.com/settore/settore-pluto
redirect 301 /settore-3 http://vvv.nomesito.com/settore/settore-topolino
redirect 301 /settore-4 http://vvv.nomesito.com/settore/settore-paperino
redirect 301 /settore-5 http://vvv.nomesito.com/settore/settore-qui-quo-qua
redirect 301 /settore-6 http://vvv.nomesito.com/settore/settore-zio-paperone
redirect 301 /settore-7 http://vvv.nomesito.com/settore/settore-nonna-papera
redirect 301 /settore-8 http://vvv.nomesito.com/settore/settore-eta-betaHo aggiunto "quasi" perché anche in questo mi trovo in coda all'url *?_route_=settore-x* aggiunto, probabilmente, dall'url rewrite del CMS. Stavolta aggiungere *?* alla fine della riga da come unico risultato il redirect verso il seguente url: *http://vvv.nomesito.com/settore/settore-pippo?* Non ho del tutto risolto ma almeno avviene correttamente il redirect verso la pagina del nuovo sito. Oltre a risolvere questo problema della "coda" del redirect mi farebba anche piacere comprendere il perché l'url generato dal rewrite mi dia un errore di pagina non trovata. Grazie.
-
Prova a mettere il set di rewrite custom prima delle regole del CMS.
Inoltre per fare quei redirect 1 a 1 è meglio che usi il RedirectMatch e metti alla fine il flag che indica di fermarsi nei rewrite dopo che la regola viene evasa.
Maggiori info qui http://httpd.apache.org/docs/2.4/rewrite/flags.html
-
Andiamo con ordine:
- ho spostato il rewrite custom prima di quello del CMS e non è cambiato nulla;
- ho modificato il redirect in RedirectMatch ma aggiungendo il flag alla fine mi da un Internal Server Error, se il flag lo unisco alla riga senza spazi (redirect 301 /settore-1 http://vvv.nomesito.com/settore/settore-pippo) ottengo il redirect al seguente url: http://vvv.nomesito.com/settore/settore-pippo[L]?route=settore-1;
- da quel che ho letto nella pagina che hai indicato, il flag R=301 si utilizza per specificare che quel determinato rewrite è anche un redirect, ma non credo che questo sia il mio caso poiché l'url che viene generato di fatto non esiste, mi serve soltanto per avere un url privo di variabili sul quale effettuare il redirect. Ho quindi modificato il codice che mi hai indicato (RewriteRule ^(.)$ http://vvv.nomesito.com/settore-%1? *) ma la pagina alla quale vengo indirizzato dopo il rewrite risulta sempre inesistente, o meglio il CMS mi rimanda ad una pagina con il messaggio "La pagina richiesta non è stata trovata.", che credo sia il modo nel quale vengono gestite dal CMS le pagine inesistenti.
Arriverò mai a risolvere tutto questo?
-
Mi incolli quello che hai messo nell'htaccess?
-
Options +FollowSymlinks # Prevent Directoy listing Options -Indexes # Prevent Direct Access to files <FilesMatch "\.(tpl|ini|log)"> Order deny,allow Deny from all </FilesMatch> # SEO URL Settings RewriteEngine On # If your opencart installation does not run on the main web folder make sure you folder it does run in ie. / becomes /shop/ # rewrite custom RewriteCond %{REQUEST_URI} ^/dir/categorie\.php$ RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ RewriteRule ^(.*)$ http://nomesito.com/settore-%1? RedirectMatch 301 /settore-1 http://nomesito.com/settore/settore-pippo RedirectMatch 301 /settore-2 http://nomesito.com/settore/settore-pluto RedirectMatch 301 /settore-3 http://nomesito.com/settore/settore-topolino RedirectMatch 301 /settore-4 http://nomesito.com/settore/settore-paperino RedirectMatch 301 /settore-5 http://nomesito.com/settore/settore-qui-quo-qua RedirectMatch 301 /settore-6 http://nomesito.com/settore/settore-zio-paperone RedirectMatch 301 /settore-7 http://nomesito.com/settore/settore-nonna-papera RedirectMatch 301 /settore-8 http://nomesito.com/settore/settore-eta-beta RewriteBase / RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap RewriteRule ^googlebase.xml$ index.php?route=feed/google_base RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css) RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
I RedirectMatch danno il problema sopra indicato, il flag l'ho lasciato solo nel primo con il risultato precedentemente descritto.
Grazie
-
Ok.
Ho aggiunto questa riga senza perché quello lo puoi usare solo con la rewriterule.
RedirectMatch 301 ^/settore-10 http://www.nomesito.com/settore/settore-pippo
e il redirect avviene correttamente.
-
E mi sa di no.
Anche in questo modo ottengo sempre http://vvv.nomesito.com/settore/settore-pippo?route=settore-1.
Ma com'è possibile che non mi riesca una cosa che viene fatta da miliardi di persone? Mi sembra di essere vittima di una maledizione.
-
Credo che ci sia una regola di OpenCart che crea un doppio redirect.
A questo punto credo che ti convenga creare un .htaccess nella cartella /dir/ e farei il redirect diretto dalla URL parametrica a quella finale senza il passaggio intermedio.
-
Eureka!
Sicuramente non ho utilizzato la sintassi migliore ma ho ottenuto il risultato desiderato:
# SEO URL Settings RewriteEngine On # If your opencart installation does not run on the main web folder make sure you folder it does run in ie. / becomes /shop/ # rewrite custom RewriteCond %{REQUEST_URI} ^/dir/categorie\.php$ RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ RewriteRule ^(.*)$ http://nomesito.com/dir/settore-%1? RedirectMatch 301 /settore-1 http://nomesito.com/settore/settore-pippo RedirectMatch 301 /settore-2 http://nomesito.com/settore/settore-pluto RedirectMatch 301 /settore-3 http://nomesito.com/settore/settore-topolino RedirectMatch 301 /settore-4 http://nomesito.com/settore/settore-paperino RedirectMatch 301 /settore-5 http://nomesito.com/settore/settore-qui-quo-qua RedirectMatch 301 /settore-6 http://nomesito.com/settore/settore-zio-paperone RedirectMatch 301 /settore-7 http://nomesito.com/settore/settore-nonna-papera RedirectMatch 301 /settore-8 http://nomesito.com/settore/settore-eta-beta
Nel percorso del RewriteRule ho dovuto inserire /dir/ altrimenti non avrebbe funzionato, ma dal momento che mi serve solo per effettuare il redirect poco importa. Penso questo sia dovuto al fatto che il comando si trova all'interno di dir e non più nella root.
Non ho idea di come fare il redirect diretto al quale fai riferimento ma sinceramente non mi va di disturbarti oltre, anche perché adesso devo dedicarmi agli url con più variabili e sono sicuro di aver nuovamente bisogno del tuo aiuto.Ritengo tuttavia che questo risultato sia più che buono per oggi.
Grazie ancora e buona serata.