• Admin

    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]
    
    

  • User Attivo

    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-beta

    
    Ho 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.

  • Admin

    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


  • User Attivo

    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?


  • Admin

    Mi incolli quello che hai messo nell'htaccess?


  • User Attivo
    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


  • Admin

    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.


  • User Attivo

    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.


  • Admin

    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.


  • User Attivo

    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.


  • User Attivo

    L'avevo detto che sarei tornato alla carica!

    Adesso devo fare il redirect di url con più variabili.
    Il maggior numero è presente nel seguente url:

    vvv.nomesito.com/dir/pagina.php?iddettaglio=1&idcategoria=1&idsottodettaglio=1&idscelta=2
    

    Un altro esempio, stavolta con la presenza di una variabile non numerica, è il seguente:

    vvv.nomesito.com/dir/pagina.php?idcat=7&idsettore=6&settore=nomeSettore&pagina=2
    

    Anche qui non so come fare.

    In altre discussioni hai scritto che in caso di più variabili va usato un operatore logico ma per unire le query string non ho trovato alcun esempio pratico di come vada scritto il codice.
    Forse con questo ulteriore piccolo aiuto potre risolvere questa faccenda.

    Grazie.


  • Admin

    Ciao Eugene,

    ben tornato 😄

    Potresti fare una cosa simile

    RewriteEngine On
    
    
    RewriteCond %{QUERY_STRING} ^iddettaglio=([^&]+) [NC,OR]
    RewriteCond %{QUERY_STRING} &iddettaglio=([^&]+) 
    RewriteRule ^dir/pagina\.php$ $0/%1
    
    
    RewriteCond %{QUERY_STRING} ^idcategoria=([^&]+) [NC,OR]
    RewriteCond %{QUERY_STRING} &idcategoria=([^&]+) 
    RewriteRule ^dir/pagina\.php/[^/]+$ $0/%1
    
    
    RewriteCond %{QUERY_STRING} ^idsottodettaglio=([^&]+) [NC,OR]
    RewriteCond %{QUERY_STRING} &idsottodettaglio=([^&]+) 
    RewriteRule ^dir/pagina\.php/([^/]+/[^/]+)$ http://vww.tuosito.com/$1/%1/? [R,L]
    

    Aggiungendo tutti i parametri e nell'ordine di cui hai bisogno.


  • User Attivo

    Grazie Juanin e bentrovato.

    Ho inserito il codice indicato ma non accade assolutamente nulla, nemmeno un messaggio d'errore.
    Ho i seguenti dubbi:

    • il request_uri rimane lo stesso e va dichiarato nuovamente prima dei query_string?
    • il codice che hai indicato va inserito di seguito al precedente (quello per gli url con una sola variabile) o va in qualche modo integrato?
    • devo prevedere un blocco di codice per ogni tipologia di url (1 variabile, 2 variabili, 3 variabili, ecc.) oppure è sufficiente un unico blocco che preveda il numero massimo di variabili possibili?

    Buona serata e grazie mille.


  • Admin

    Puoi fare in tutti i modi che vuoi.

    Ovviamente le regole non devono sovrapporsi.

    Io ti ho messo solo un esempio di come usare l'OR, ma potresti in alcuni casi anche dover usare l'AND.

    Insomma ti ho messo la sintassi da utilizzare qualora tu dovessi usare più variabili, ma considera che devi cambiare poi anche la composizione che hai dell'URL in rewrite rule.


  • User Attivo

    Buonasera Juanin e perdona la mia ottusità ma come ho già detto mi mancano le basi del rewrite url ed in questo momento tutto il materiale che ho letto mi risulta quasi incomprensibile.<br>So che dovrei fare le cose con calma ma ho la necessità di completare questo lavoro adesso. Una volta terminato studierò con calma questo benedetto argomento.<br><br>Una cosa che crea ulteriore confusione è la difformità di informazioni trovate in rete, probebilmente ogni contesto richiede un codice personalizzato e quindi non è possibile compilare un rewrite "universale".<br><br>Per poter capire qualcosa ho bisogno di un esempio pratico con spiegazione dei vari passaggi.<br>L'esempio che tu hai indicato, per quanto chiaro, contiene degli elementi dei quali ignoro il significato e pertanto non so come comportarmi in caso di variazioni o di non funzionamento del codice.<br><br>Ipotizziamo che io voglia trasformare l'url

    vvv.nomesito.com/dir/pagina.php?idcat=7&idsettore=6&settore=nomeSettore&pagina=2
    

    in

    vvv.nomesito.com/dir/categoria-7/nomeSettore-6/pagina-2
    

    dovrei usare il seguente codice:

    RewriteCond %{QUERY_STRING} ^idcat=([^&]+) [NC,OR]
    RewriteCond %{QUERY_STRING} &idcat=([^&]+) 
    RewriteRule ^dir/pagina\.php$ $0/%1
    
    RewriteCond %{QUERY_STRING} ^idsettore=([^&]+) [NC,OR]
    RewriteCond %{QUERY_STRING} &idsettore=([^&]+) 
    RewriteRule ^dir/pagina\.php/[^/]+$ $0/%1
    
    RewriteCond %{QUERY_STRING} ^settore=([^&]+) [NC,OR]
    RewriteCond %{QUERY_STRING} &settore=([^&]+) 
    RewriteRule ^dir/pagina\.php/([^/]+/[^/]+)$ $0/%1
    
    RewriteCond %{QUERY_STRING} ^pagina=([^&]+) [NC,OR]
    RewriteCond %{QUERY_STRING} &pagina=([^&]+) 
    RewriteRule ^dir/pagina\.php/([^/]+/[^/]+/[^/]+)$ http://vww.tuosito.com/$1/%1/? [R,L]
    

    Ovviamente non funziona.

    Iniziamo con le richieste di chiarimenti:

    • in un tuo commento in un'altra discussione hai detto che bisogna sempre indicare il request uri, ma qui non è dichiarato. Potrebbe essere questa la causa del non fuznionamento?
    • ritengo di aver compreso il significato di NC, OR e ^& ma non mi sono tanto chiari i ^/, $1 e %1 presenti nel rewrite rule, soprattutto non mi è chiaro, nell'ultimo rewrite rule, come vengano inserite le quattro variabili nel nuovo url.

    Grazie mille e buona serata.