• User Attivo

    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?


  • Admin

    Che CMS usi?

    Che .htaccess utilizza?


  • User Attivo

    Cosa intendi dire, vuoi che posti il codice contenuto nell'.htaccess?


  • User Attivo

    Comunque il CMS è OpenCart.


  • Admin

    Sì posta il codice dell'htaccess.


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


  • Admin

    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.


  • User Attivo

    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?


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