PROZONE powered by Tophost
  Home   Forum   Regolamento Help Login Registrati   *
Statistiche
Utenti
Utenti Totali: 1707
Ultimo utente: xal
Statistiche
Posts Totali: 29470
Topics Totali: 3404
Online Oggi: 51
Presenze Massime Online: 559
(23 Luglio 2008, 14:24:28)
Utenti Online
Utenti: 0
Visitatori: 48
Totale: 48
Siti amici
Design & Multimedia

Dire e Fare il blog che ti aiuta

Wordpress
Pagine: [1]
 
Autore Topic: Mod_rewrite X Sito Multilingua  (Letto 2392 volte)
countzero
Nuovo Utente
**
Posts: 5


Mod_rewrite X Sito Multilingua
« il: 24 Aprile 2006, 13:18:18 »

Ciao a tutti,
ho letto con interesse la guida a  Mod_rewrite qui pubblicata. Conoscevo già questa funzione dei web server apache, ma solo ultimamente ho avuto la necessità di utilizzarla.

Per un sito multilingua vorrei gestire gli url in modo intelligente e ho scritto il seguente file:
Codice:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^english/(.*)$ inglese.php [L]
RewriteRule ^italiano/(.*)$ italiano.php [L]
RewriteRule ^(.*)$ index.php

Vorrei che tutti gli indirizzi del formato miosito.it/english/miapagina.html siano indirizzati ad una pagina, quelli che incominciano per italiano ad un'altra e tutto il resto passi dal file index.php che si preoccuperà di gestire la richiesta.
A parte la correttezza della struttura che vorrei utilizzare, il tutto non sembra funzionare, ed in particolare il flag [L] sembra non interrompere il processo.
Leggendo il log del mod_rewrite, qualsiasi url del tipo miosito.it/english/miapagina.html viene convertita in miosito.it/inglese.php correttamente, ma poi viene fatta un'altra concersione in miosito.it/index.php

Sembra che applicata la prima regola poi vengano processate anche le altre.
Sto testando il tutto in ambiente windows con apache 1.3.29 e PHP 4.3.4

Qualche suggerimento o articoli/guide da consultare?
Grazie per l'attenzione
 
Loggato
guardaqua
Supervisore
*
Posts: 717


Mod_rewrite X Sito Multilingua
« Risposta #1 il: 24 Aprile 2006, 15:03:06 »

Il tuo codice presenta diversi errori concettuali.
Innanzitutto, il flag [L] sta per LAST, ovvero "questa è l'ultima regola da processare".
E' chiaro che non ce ne possono essere due Sorriso

Inoltre, le RewriteRule sono corrette, ma manca qualsiasi condizione (RewriteCond).

Dovresti fare in modo che SE l'indirizzo richiesto è /english/ direziona su inglese.php, e non in ogni caso (come è ora). Lo stesso per l'italiano.

Una condizione che potrebbe essere scritta così:
RewriteCond %{REQUEST_URI} ^/english/(.*)$
seguita dalla regola.

Poi, altra condizione -> altra regola.

Se vuoi dare un'occhiata alla documentazione:
Specifiche del mod_rewrite: http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
Espressioni regolari: http://it.php.net/manual/it/reference.pcre...tern.syntax.php
Guida al rewrite con esempi: http://httpd.apache.org/docs/1.3/misc/rewriteguide.html
Bignami del mod_rewrite: http://www.ilovejackdaniels.com/cheat-shee...te-cheat-sheet/

Solo per completezza, poi, cito le due guide che hai già letto:
http://www.prozone.it/forum/index.php?showtopic=1270
http://www.prozone.it/forum/index.php?showtopic=1294

P.S. Io comunque per il multilingua non farei così, ma farei un sottodominio per ogni lingua:
it.sito.com
en.sito.com
de.sito.com
ecc ecc... così ogni idioma ha un sito a sè, invece di un unico sito che un eventuale robot avrebbe difficoltà a catalogare linguisticamente

Dimenticavo: benvenuto/a Sorriso
« Ultima modifica: 24 Aprile 2006, 15:05:45 da guardaqua » Loggato

countzero
Nuovo Utente
**
Posts: 5


Mod_rewrite X Sito Multilingua
« Risposta #2 il: 26 Aprile 2006, 18:44:56 »

Ciao,
grazie per il suggerimento e la spiagazione, ma le espressioni regolari non sono il mio forte.. :-(

Non avevo nemmeno capito il concetto di condizioni + regola...

A parte la discutibile struttura vs sottodomini
ho scritto il .htaccess in questo modo, come mi hai suggerito
Codice:
RewriteCond %{REQUEST_URI} ^/english/(.*)$
RewriteRule ^english/(.*)$ inglese.php [L]

RewriteCond %{REQUEST_URI} ^/italiano/(.*)$
RewriteRule ^italiano/(.*)$ italiano.php [L]

Dopo ogni RewriteRule posso mettere il flag [L] per dire che si tratta dell'ultima regola?!


poi vorrei che tutto ciò che non è  ^italiano/(.*)$  o ^english/(.*)$  fosse passato ad un index.php che si occupa di gestire il tutto...
ma non sono riuscito a creare una condizione che funzioni, ho pensato a negare le precedenti condizioni, ma non ha funzionato...

 
Loggato
doGmaI
Utente Attivo
****
Posts: 280


Mod_rewrite X Sito Multilingua
« Risposta #3 il: 26 Aprile 2006, 22:07:16 »

Citazione
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
RewriteRule  ^/$                 /homepage.max.html  [L]

RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  ^/$                 /homepage.min.html  [L]

RewriteRule  ^/$                 /homepage.std.html  [L]

Questo è preso dalla documentazione ufficiale di mod_rewrite
Quindi con gli opportuni adattamenti il tuo .htaccess dovrebbe essere:
Citazione
RewriteCond %{REQUEST_URI} ^/english/(.*)$
RewriteRule ^english/(.*)$ inglese.php [L]

RewriteCond %{REQUEST_URI} ^/italiano/(.*)$
RewriteRule ^italiano/(.*)$ italiano.php [L]

RewriteRule ^(.*)$ index.php [L]

Non l'ho testato ma dovrebbe andare
Per il flag [L] invece ce ne può essere più di uno. [L] sta per LAST ma non ultima regola del file, bensì ultima regola di una catena di una o più regole consecutive di una condizione.
Diciamo che la struttura del file a grandi linee è:
RewriteCond
1 o + RewriteRule, l'ultima seguita da un [L]

altra RewriteCond
1 o + RewriteRule, l'ultima seguita da un [L]

altra RewriteCond
1 o + RewriteRule, l'ultima seguita da un [L]

ecc ecc
Loggato

countzero
Nuovo Utente
**
Posts: 5


Mod_rewrite X Sito Multilingua
« Risposta #4 il: 28 Aprile 2006, 20:35:34 »

Ciao,
 Triste  purtroppo sembra non funzionare.
Codice:
RewriteCond %{REQUEST_URI} ^/english/(.*)$
RewriteRule ^english/(.*)$ inglese.php [L]

RewriteCond %{REQUEST_URI} ^/italiano/(.*)$
RewriteRule ^italiano/(.*)$ italiano.php [L]

RewriteRule ^(.*)$ index.php [L]

Guardando i log, sembra che dopo ogni rewrite venga riprocessato il file .htaccess

Per cui se scrivo
www.miosito.it/italiano/prova.htm
questo viene prima processato e fa il matched con ^/italiano/(.*)$,
poi viene riprocessato e gli viene riapplicata l'ultima regola...

Non saprei... forse occorre mettere una condizione tipo "se non è /italiano/ e non è /english/" esegui questa regola...

 :boh:  
Loggato
guardaqua
Supervisore
*
Posts: 717


Mod_rewrite X Sito Multilingua
« Risposta #5 il: 28 Aprile 2006, 21:11:12 »

Citazione
poi viene riprocessato e gli viene riapplicata l'ultima regola...
Ci credo Wow
Quella regola non è limitata da nessuna condizione, per cui viene eseguita in ogni caso. Per cui hai visto giusto quando dici:
Citazione
Non saprei... forse occorre mettere una condizione tipo "se non è /italiano/ e non è /english/" esegui questa regola...
Codice:
RewriteCond %{REQUEST_URI} !^/english/(.*)$
RewriteCond %{REQUEST_URI} !^/italiano/(.*)$
RewriteRule ^(.*)$ index.php [L]

dove il punto esclamativo indica "DIVERSO DA"  :ciao:
« Ultima modifica: 28 Aprile 2006, 21:12:52 da guardaqua » Loggato

countzero
Nuovo Utente
**
Posts: 5


Mod_rewrite X Sito Multilingua
« Risposta #6 il: 29 Aprile 2006, 07:03:59 »

Grazie mille per la risposta,
ma nemmeno così funziona...

A dire la verità avevo già provato...

Comunque ho cercato di leggere i log e ho scoperto un dettaglio che  non conoscevo o che non avevo tenuto in considerazione....

Dopo che viene applicata un regola sembra che venga rifatta una richiesta e quindi realaborate la varie regole, per cui con codice scritto in questo modo
Codice:
RewriteCond %{REQUEST_URI} ^/english/(.*)$
RewriteRule ^english/(.*)$ inglese.php [L]

RewriteCond %{REQUEST_URI} ^/italiano/(.*)$
RewriteRule ^italiano/(.*)$ italiano.php [L]

RewriteRule ^(.*)$ index.php [L]

ed una richiesta del tipo
Codice:
http://www.miosito.it/italiano/prova/test/lamiapagina.html
veniva processata correttamente e la richiesta veniva trasformata in
Codice:
http://www.miosito.it/italiano.php

qui sorgeva il problema, questa pagina viene (se non ho capito male) richiesta nuovamente per cui il .htaccess viene rielaborato e questo nuovo indirizzo è matched con l'iltima condizione.

La soluzione finale dovrebbe essere qualcosa del tipo
Codice:
RewriteCond %{REQUEST_URI} ^/english/(.*)$
RewriteRule ^english/(.*)$ inglese.php [L]

RewriteCond %{REQUEST_URI} ^/italiano/(.*)$
RewriteRule ^italiano/(.*)$ italiano.php [L]

RewriteCond %{REQUEST_URI} !^/italiano.php$
RewriteCond %{REQUEST_URI} !^/inglese.php$
RewriteRule ^(.*)$ index.php [L]

in quanto alla seconda richiesta verifichiamo se non ci sia stata una precedente trasformazione della richiesta e controlliamo che la richiesta sia diversa da /italiano.php o /inglese.php

Poi a livello di struttura è discutibile se è oppurtuno utilizzare un discorso del genere oppure domini di terzo livello, ma mi sono voluto accanire su questo per capire meglio il funzionamento.
 B)
Se qualcuno vuole aggiungere, corregere o integrare, ben venga
Grazie a tutti
Loggato
countzero
Nuovo Utente
**
Posts: 5


Mod_rewrite X Sito Multilingua
« Risposta #7 il: 29 Aprile 2006, 10:44:35 »

Come non detto...

confermo che leggendo il log sembra che dopo aver applicato una regola, alla nuova richiesta viene processato nuovamente il .htaccess

Mi sembra strano.. in tutte le guide che leggo online viene specificato che questo [L] significa che è l'ultima regola applicata se viene fatto il rewrite... ma non sembra fare questo...

Codice:
RewriteCond %{REQUEST_URI} ^/english/(.*)$
RewriteRule ^english/(.*)$ inglese.php [L]

RewriteCond %{REQUEST_URI} ^/italiano/(.*)$
RewriteRule ^italiano/(.*)$ italiano.php [L]

RewriteCond %{REQUEST_URI} !^/italiano.php$
RewriteCond %{REQUEST_URI} !^/inglese.php$
RewriteRule ^(.*)$ index.php [L]

Questo codice postato non funziona correttamente solo perchè la prima trasformazione con questo url
Codice:
http://www.miosito.it/italiano/prova/test/lamiapagina.html
crea questo
Codice:
http://www.miosito.it/italiano.php/prova/test/lamiapagina.html

e comunque l'ultima regola mi riporta il tutto a index.php

:capocciata:
 
Loggato
Pagine: [1]
 
 
Salta a:  

Oggetto Iniziato da Risposte Visto Ultimo Post
Regolamento effe8 0 11643 Ultimo Post 28 Maggio 2007, 14:54:15
da effe8
Il modulo mi fa arrabbiare! puma512 2 2574 Ultimo Post 8 Febbraio 2009, 23:09:42
da puma512
PHP come modulo o come CGI? lacellula 2 4435 Ultimo Post 14 Giugno 2007, 18:30:19
da gja
[suggerimento] Filtro Antispam (lungo) « 1 2 » doGmaI 17 8533 Ultimo Post 24 Luglio 2008, 18:35:16
da giorgio
Installazione di e107 su TopHost lacellula 0 45576 Ultimo Post 11 Giugno 2007, 12:03:52
da lacellula
Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC
Traduzione Italiana a cura di SMItalia

TinyPortal v0.9.8 © Bloc
XHTML 1.0 Valido! CSS Valido!


Ultima visita di Google a questa pagina 3 Agosto 2010, 06:04:21