\\ Home Page : Articolo : Stampa
CodeIgniter: caratteri speciali e URI
Di Manuel  (del 25/02/2010 @ 11:17:11, in Web Development, linkato 314 volte)

In questi ultimi mesi sto affrontando la realizzazione di piccoli siti dinamici, completi di pannello di amministrazione.
Il linguaggio è PHP, il database è MySQL, il server è Linux e il webserver è... Apache! Ebbene sì, si tratta del classico ambiente LAMP.
La novità è che, per affrontare i progetti, non scrivo "codice selvaggio", ma mi appoggio ad un framework open source chiamato CodeIgniter.

Il framework è versatile, comodo e accompagnato da una nutrita schiera di estimatori e programmatori.
Purtroppo, come spesso accade nel mondo delle apllicazioni web, essendo il framework una "creatura" inglese, non ha affrontato nativamente il problema dei caratteri speciali: à, è, é, ì, ò, ù (per noi italiani, ad es.).
Questo problema mi è diventato palese nel momento in cui ho cercato di trasmettere stringhe di ricerca con simili caratteri all'URI segmentato tipico di CodeIgniter (quando non si desidera utilizzare la classica querystring: pippo.php?c=prendi&m=fai&v=questo).

Il framework, infatti, per motivi di sicurezza (indiscutibili), ammette nei suoi URI questa serie di caratteri:
a-z 0-9~%.:_\-
Nel momento in cui un italiano scrive in un modulo di ricerca "gravità" appare a video un pagina bianca che riporta il seguente errore:

The URI you submitted has disallowed characters.

Per risolvere la questione ho dovuto perdere un paio di giorni di ricerche su Google e alla fine ho trovato questo salvifico articolo:

CodeIgniter 1.7: The URI you submitted has disallowed characters.

Se avete lo stesso problema, andate in system/libraries e aprite il file URI.php alla linea 189 e modificate:

if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str))

così:

if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", rawurlencode($str)))

Questa soluzione si applica a CodeIgniter 1.7.