• User Attivo

    mod rewrite per sito multilingua

    Ciao a tutti,
    sto facendo un sito multilingua e vorrei gestirlo in maniera google friendly.
    La lingua di default è italiano.
    Io vorrei fare in modo che quando accedo si trovi direttamente
    www.example.it
    cliccando sul cambio della lingua in inglese dovrebbe andare su
    www.example.it/en/
    però vorrei che tutti i file rimanessero unici in modo da non doverli duplicare.
    Come posso fare?

    Queste regole le ho già inserite nel mio htaccess per gestire le pagine normalmente

    RewriteEngine On
    RewriteBase /
    RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)\.html$ itinerari.php?&categoria=$1&sottocategoria=$2&pagina=$3
    RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).$ itinerari.php?&categoria=$1&sottocategoria=$2
    RewriteRule ^([a-zA-Z0-9-]+).$ itinerari.php?&categoria=$1
    

  • Super User

    Prova così:

    
    RewriteEngine On
    RewriteBase /
    RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)\.html$ itinerari.php?&categoria=$1&sottocategoria=$2&pagina=$3
    RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).$ itinerari.php?&categoria=$1&sottocategoria=$2
    RewriteRule ^([a-zA-Z0-9-]+).$ itinerari.php?&categoria=$1
    
    RewriteRule ^en/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)\.html$  itinerari.php?&categoria=$1&sottocategoria=$2&pagina=$3
    RewriteRule ^en/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).$ itinerari.php?&categoria=$1&sottocategoria=$2
    RewriteRule ^en/([a-zA-Z0-9-]+).$ itinerari.php?&categoria=$1
    
    

  • User Attivo

    Perfetto, grazie funziona!
    Avevo trovato anche questa soluzione

    
    RewriteRule ^fr/(.*)$ /$1 [QSA,L]
    RewriteRule ^en/(.*)$ /$1 [QSA,L]
    RewriteRule ^de/(.*)$ /$1 [QSA,L]
    
    

    posso chiederti cosa cambia?


  • Super User

    @pettedemon said:

    Perfetto, grazie funziona!
    Avevo trovato anche questa soluzione

    >
    RewriteRule ^fr/(.*)$ /$1 [QSA,L]
    RewriteRule ^en/(.*)$ /$1 [QSA,L]
    RewriteRule ^de/(.*)$ /$1 [QSA,L]
    
    >```posso chiederti cosa cambia?
    
    Praticamente niente. Sicuramente quest'ultima è più mantenibile in caso di modifiche e/o aggiunte.
    Teoricamente fa puntare le pagine della lingua alle pagine a monte che a loro volta puntano alle regole da te definite (p.e.: itinerari.php? ...)

  • User Attivo

    Ciao,
    per problemi "tecnici" , mi sono un pò perso.
    Ora considerando che tutte le mie pagine le voglio far caricare da database e che il mio sito è multilingua, come posso far gestire le lingue?

    La mia pagina sarà index.php?lang=it

    e questa sarà quella di default ma devo dire che quando non trova parametri vada direttamente su www.sito.it ma devo anche indicare al get il parametro...

    Poi per la lingua inglese ad esempio index.php?lang=en come lo posso gestire per farlo andare in www.sito.it/en ??
    grazie!!!


  • Super User

    @pettedemon said:

    Ciao,
    per problemi "tecnici" , mi sono un pò perso.
    Ora considerando che tutte le mie pagine le voglio far caricare da database e che il mio sito è multilingua, come posso far gestire le lingue?

    La mia pagina sarà index.php?lang=it

    e questa sarà quella di default ma devo dire che quando non trova parametri vada direttamente su www.sito.it ma devo anche indicare al get il parametro...

    Perchè passare un ulteriore parametro? La lingua puoi procurartela dal dominio di primo livello
    @pettedemon said:

    Poi per la lingua inglese ad esempio index.php?lang=en come lo posso gestire per farlo andare in www.sito.it/en ??
    grazie!!!

    Se intendi redirect 301, cosi:

    
    RewriteRule ^index.php?lang=(.*)$ www.sito.it/$1 [R=301]
    
    

  • User Attivo

    Perchè praticamente devo selezionare il database in base alla lingua, ma essendo di default italiano volevo evitare che nella barra degli indirizzi si vedesse /it/ .

    il massimo del percorso sarà www.miosito.it/en/camere/prezzi.html#camere

    quindi devo prevedere di gestire più parametri, mentre come ti spiegavo prima per l'italiano volevo evitare si vedesse il /it/
    si può fare?
    Graziee!


  • User Attivo

    l'indirizzo di partenza dovrebbe essere www.sito.it, mentre per le altre lingue sarà www.sito.it/en/

    Mi son creato queste regole
    [PHP]codice: RewriteEngine On
    RewriteBase /

    RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html$ index.php?&lang=$1&pagina=$2 [QSA,L]
    RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html$ pagina.php?&lang=$1&cartella=$2&pagina=$3 [QSA,L] [/PHP]

    questo mi gestisce le pagine www.sito.it/it/pagina.html e anche
    www.sito.it/it/pagina/pagina.html

    vorrei però eliminare /it/ nel dominio italiano però mi serve come parametro per accedere al database dei contenuti in italiano.

    Poi mi troverei anche col dover inserire una regola perchè la pagina /index.html venisse letta anche se digito solamente /

    Qualche suggerimento??


  • Super User

    Non so se ho capito bene
    prova cosi:

    
    RewriteEngine On
    RewriteBase /
    
    RewriteRule ^en/([a-zA-Z0-9-]+).html$ /index2.php?lang=en [L, NC]
    RewriteRule ^fr/([a-zA-Z0-9-]+).html$ /index2.php?lang=fr [L, NC]
    RewriteRule ^([a-zA-Z0-9-]+).html$ /index2.php?lang=it [L, NC]
    
    

    In pratica la prima e la seconda riga intercettano gli url del tipo /en/aaa.html e /fr/aaa.html.
    In questo modo la terza regola ossia l'italiano viene eseguita se non sono eseguite le altre due


  • User Attivo

    Perfetto!
    Infatti se non c'è nulla mi prende in get il parametro it....
    adesso se io volessi gestire altri parametri come nell'esempio che ti ho riportato?


  • User Attivo

    Forse sto facendo un po di confusione però così sta funzionando
    [HTML]RewriteRule ^en/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html$ /pagina.php?lang=en&cartella=$1&pagina=$2 [L,NC]
    RewriteRule ^fr/([a-zA-Z0-9-]+).html$ /index.php?lang=fr [L,NC]
    #RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html$ /index.php?lang=it&pagina=$1 [L,NC]
    RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html$ /pagina.php?lang=it&cartella=$1&pagina=$2 [L,NC][/HTML]

    il problema si presenta quando io devo utilizzare una pagina nella root
    quindi per la pagina www.sito.it/cartella/pagina.html funziona
    ma se io devo usare www.sito.it/paginina.html come posso fare per fargli riconoscere?


  • Super User
    
    RewriteRule ^/([a-zA-Z0-9-]+).html$ /pagina.php?lang=it&cartella=$1&pagina=$2 [L,NC]
    
    

  • User Attivo

    Ciao, confermo che funziona tutto, magari può servire a qualcun altro
    [PHP]
    RewriteRule ^en/([a-zA-Z0-9-]+).html$ /index.php?lang=en [L,NC]
    RewriteRule ^([a-zA-Z0-9-]+).html$ /index.php?lang=it [L,NC]
    [/PHP]

    funziona:
    digitando ww.sito.it/pagina.html recupero la variabile "it"
    digitando ww.sito.it/en/pagina.html recupero la variabile "en"

    inserendo questo codice
    [PHP]
    RewriteRule ^en/([a-zA-Z0-9-]+).html$ /index.php?lang=en&pagina=$1 [L,NC]
    RewriteRule ^en/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html$ /pagina.php?lang=en&cartella=$1&pagina=$2 [L,NC]
    RewriteRule ^([a-zA-Z0-9-]+).html$ /index.php?lang=it&pagina=$1 [L,NC]
    RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html$ /pagina.php?lang=it&cartella=$1&pagina=$2 [L,NC]
    [/PHP]

    funziona:
    digitando ww.sito.it/pagina.html recupero la variabile "it" e "pagina"
    digitando www.sito.it/en/pagina.html recupero la variabile "en" e "pagina"

    digitando ww.sito.it/cartella/pagina.html recupero le variabili "it" - "cartella" - "pagina"
    digitando ww.sito.it/en/cartella/pagina.html recupero le variabili "en" - "cartella" - "pagina"


  • User Attivo

    Ora mi macherebbe solo una cosa...
    se io digito ww.sito/index.html i recupera la variabile "it" - "index"

    Se invece io volessi eliminare la pagina index e fare in modo che digitando www.sito.it legga automaticamente index.html come di default e mi continui a recuperare le 2 variabili come posso fare?

    Lo stesso mi servirebbe per se digito ww.sito.it/en/

    Grazieeeeeee


  • Super User

    @pettedemon said:

    Ora mi macherebbe solo una cosa...
    se io digito ww.sito/index.html i recupera la variabile "it" - "index"

    Se invece io volessi eliminare la pagina index e fare in modo che digitando www.sito.it legga automaticamente index.html come di default e mi continui a recuperare le 2 variabili come posso fare?

    Lo stesso mi servirebbe per se digito ww.sito.it/en/

    Grazieeeeeee

    Prova cosi:

    
    RewriteRule ^en/([^index]+).html$ /index.php?lang=en&pagina=$1 [L,NC]
    RewriteRule ^en/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html$ /pagina.php?lang=en&cartella=$1&pagina=$2 [L,NC]
    RewriteRule ^([^index]+).html$ /index.php?lang=it&pagina=$1 [L,NC]
    RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html$ /pagina.php?lang=it&cartella=$1&pagina=$2 [L,NC]