Visualizzazione risultati 1 fino 10 di 10

Discussione: RewriteRule generale per sito multi lingua. variabile alla radice dell'url.

  1. #1
    Guest

    Predefinito RewriteRule generale per sito multi lingua. variabile alla radice dell'url.

    Sto creandomi un CMS e ho l'esigenza di avere una regola che non debba essere ripetuta per ogni RewriteRule delle altre pagine e che non debba essere aggiunta alla fine dell'url come QUERY_STRING.
    Devo simulare una directory per la lingua, in modo da avere anche una migliore indicizzazione su google.
    Attualmente ho queste regole:
    Codice:
    RewriteRule ^(it|en)(([/])?([^/]+)?)$		$3?lang=$1 [QSA,L]
    RewriteRule ^(join|(log(in|out)))$		index.php?action=$1 [QSA,L]
    RewriteRule ^forum$				forum.php [QSA,L]
    RewriteRule ^user/([^/]{1,255})$		account.php?view=user&name=$1 [QSA,L]
    Le prime tre regole funzionano senza problemi, mentre nella terza non funziona, mi restituisce l'errore 404.

    Se vado a /path/it o /path/it/forum tutto funziona correttamente, ma se vado alla pagina path/it/user/root mi restituisce l'errore, mentre in /path/user/root funziona correttamente la 4° RewriteRule!

    Aiuti e/o suggerimenti su come strutturare il CMS?

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Io ho avuto un sistema simile in passato, basato su questo htaccess
    Codice:
    RewriteRule ^archivi/(.*)$ /archivi.php/$1/
    RewriteRule ^immagini/(.*)$ /images.php/$1/
    
    RewriteRule ^en/(.*)$ /$1?lang=en
    RewriteRule ^it/(.*)$ /$1?lang=it
    Il tuo problema è l'applicazione di due regole che aggiungono parametri get, che creano confusione. Al tempo avevo risposto passando solo la lingua come parametro, ed il resto come $_SERVER['PATH_INFO'] (prime due regole).

    Forse puoi adattare la cosa, od invertirla, usando il PATH_INFO per la lingua ed i parametri get per tutto il resto?

  3. #3
    Guest

    Predefinito

    Aspetta, non ho capito come potrei risolvere! PATH_INFO cosa risulta precisamente? Altrimenti posso scrivere la regola per la lingua per RewriteRule, ma questo significa tanto codice in più nell'htaccess, per esempio così:
    Codice:
    RewriteRule ^((it|en)[/])?user/([^/]{1,255})$	account.php?lang=$2&view=user&name=$3 [QSA,L]
    Facendo così anche se non fosse la "directory" virtuale della lingua, farei i controlli nello script in PHP, valorizzando la variabile in base alle mie esigenze.
    Però, se si potesse risolvere tramite htaccess e scrivendo una sola regola simile alla prima che ho, mi eviterei tanto lavoro e codice...

    Grazie

  4. #4
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    'PATH_INFO'
    Contains any client-provided pathname information trailing the actual script filename but preceding the query string, if available. For instance, if the current script was accessed via the URL http://www.example.com/php/path_info.php/some/stuff?foo=bar, then $_SERVER['PATH_INFO'] would contain /some/stuff.
    PATH_INFO contiene tutto quello che segue l'indirizzo della pagina, ma precede la query. La mia idea era di riscrivere

    http://sito.com/en/user/nomeutente

    in

    http://sito.com/en/user.php?id=nomeutente

    tramite normale regola, e poi spostare la lingua come path_info

    http://sito.com/user.php/en/?id=nomeutente

    Ovviamente devi scriverti le regole di rewrite, ma non sono assurde, e non devi fare mille casi strani: basta lasciare quelle della lingua per ultime.

    In questo modo, i parametri arrivano sempre via query GET, mentre la lingua arriva dentro PATH_INFO.
    Ultima modifica di dreadnaut : 28-08-2010 alle ore 22.04.04

  5. #5
    Guest

    Predefinito

    Voglio evitare di utilizzare query string, altrimenti avrei potuto fare /user/nomeutente?lang=en
    Se devo usare per forza questo metodo, preferisco stare a riscrivere tutte le regole ed aggiungere la parte per la lingua all'inizio, senza problemi, ma mi pare assurdo non sia possibile fare una cosa del genere

  6. #6
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Citazione Originalmente inviato da biccheddu Visualizza messaggio
    Voglio evitare di utilizzare query string, altrimenti avrei potuto fare /user/nomeutente?lang=en
    Non mi sembra di averti suggerito di usarle Non puoi però sfuggire al fatto che esistano dopo la riscrittura via mod_rewrite. Purtroppo però, per quanto ne so, se ne riesce ad aggiungere solo una -- se ne aggiungi due o più ottieni un link invalido. PATH_INFO ti permette di usare una regola per alcuni parametri, ed una per un secondo gruppo.

    Mi viene qualche dubbio di non essermi spiegato bene, devo estendere la spiegazione?

  7. #7
    Guest

    Predefinito

    Allora mi sa di si, non mi pare di aver capito bene

  8. #8
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Ho fatto un paio di prove per sicurezza

    Mettiamo che hai queste due regole:
    Codice:
    RewriteRule ^(en|it)/(.*)        $2/$1
    RewriteRule ^utente/([^/]+)(.*)  user.php$2?id=$1
    Ottieni le seguenti sostituzioni, in questi due esempi:

    - http://sito.com/utente/test
    regola 1 http://sito.com/utente/test (non succede niente)
    regola 2 http://sito.com/user.php?id=test

    La pagina user.php riceve $_GET['id'] e "/" in $_SERVER['PATH_INFO']


    - http://sito.com/it/utente/test
    regola 1 http://sito.com/utente/test/it/ (sposta la lingua in ultima posizione)
    regola 2 http://sito.com/user.php/it/?id=test

    la pagina user.php riceve $_GET['id'] e "/en/utente/test" in $_SERVER['PATH_INFO']. Le stringhe en o it saranno sempre all'inizio di PATH_INFO, e quindi sono facilmente controllabili.

    Non è proprio lineare come cosa, lo ammetto, ma ti permette di scrivere le RewriteRule senza atroci contorcimenti

  9. #9
    Guest

    Predefinito

    Devo essere sincero! Mi complicherei ancora di più la vita perché dovrei parsare l'URI ed estrapolare la prima "directory" ed assegnarla alla lingua, così via con le altre, ma credo sia meno, molto meno, macchinoso e faticoso aggiungere
    Codice:
    ((it|en)[/])?
    prima e
    Codice:
    ?lang=$2
    alla fine di ogni regola. In questo modo avrei la lingua alla radice di tutto, permettendomi tramite la funzione apposita che ho creato per costruire l'url, una maggiore estensibilità e personalizzazione, nonché una gerarchia ordinata delle directory virtuali, aiutandomi (da quando letto) in una SEO migliore.

    Per concludere, credo, il problema è proprio nell'engie del mod_rewrite! Non è possibile assegnare una query string GLOBALE a tutte le pagine, giusto?

    Però mi viene in mente una cosa, non è possibile utilizzare RewriteCond per aggiungere alla {QUERY_STRING}, la variabile lang ed il suo valore?

    La mia è un'opinione! Purtroppo sono ignorante e guide che spiegano il funzionamento di ogni comando non è trovato, la maggior parte delle cose che so, le ho imparato la maggior parte per intuito!

    Grazie di cuore del supporto e delle delucidazioni dread

  10. #10
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Dalla vecchia documentazione
    Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo.
    Quella nuova però ha una spiegazione migliore.

    Il rigiro con RewriteCond puoi tentarlo, ma ci addentriamo per un territorio oscuro. Estrarre la lingua mi sembrava la cosa più semplice:

    Codice PHP:
    list(,$lang,) = @explode('/', $_SERVER['PATH_INFO'], 3);

    switch (
    $lang) {
    case
    'it':
    // ...
    case 'en':
    // ...
    default:
    // ...
    }
    Delle altre directory in PATH_INFO nulla ti importa, perché sono tradotte dalle altre regola nel nome dello script.
    Ultima modifica di dreadnaut : 29-08-2010 alle ore 11.55.18

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •