Domanda

Devo passare una stringa codificata a un controller CodeIgniter.

Esempio :

DOSOMETHING/Coldplay/Fix+You/273/X+%26+Y/

Il mio problema è il simbolo percentuale che è un carattere non consentito. Ho provato a cambiare il file di configurazione con il seguente:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\+\%';

Il + è ok, ma il % non è valido. Potete aiutarmi a cambiare questo registro exp in modo che consenta il simbolo % ? Grazie in anticipo!

È stato utile?

Soluzione

Inserisci " - " alla fine della stringa, altrimenti viene interpretato come intervallo. % È già nell'elenco dei caratteri consentiti, come puoi vedere.

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+-';

Ahem ... dopo aver rivisto la tua stringa di esempio. Ecco perché ottieni " L'URI che hai inviato ha vietato i caratteri " ;.

Breve spiegazione : aggiungi la e commerciale & amp; all'elenco dei caratteri consentiti

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+&-';

Spiegazione lunga

Ci sono 2 cose che giocano insieme.

A) CodeIgniter controlla tutti gli URI segmenti per caratteri non consentiti. Questo succede autorizzando i caratteri consentiti. Quali sono consentiti possono essere verificati in /system/application/config/config.php nella variabile $ config ['authorized_uri_chars'] . Il valore predefinito è impostato su qualcosa come 'a-z 0-9 ~%.: _-' . Pertanto sono consentite tutte le lettere dalla a alla z, lo spazio, tutti i numeri e i seguenti caratteri * ~%.: _-.

Ok, confrontiamolo con il tuo URI di esempio che ritieni funzioni

a-z 0-9~%.:_-
DO_SOMETHING/Coldplay/Fix+You/273/X+26+Y/   //note the missing %

Tutti i personaggi sono ok ... ma aspetta che dire del segno più + ? Non è nella lista dei personaggi ammessi! Eppure l'URI non si lamenta? Questa è la chiave del tuo problema.

B) CodeIgniter urldecodes i segmenti URI prima del carattere whitelist -controllare per impedire che qualcuno aggiri il controllo semplicemente urlencodizzando l'URI. Pertanto il + viene decodificato in uno spazio. Questo comportamento è dovuto al urlencode (che codifica gli spazi come + , deviando da RFC 1738 ). Questo spiega perché il segno + è consentito.

Queste due cose combinate spiegano anche perché questo URI specifico non funziona.

urldecode(DO_SOMETHING/Coldplay/Fix+You/273/X+%26+Y/) //evaluates to
//DO_SOMETHING/Coldplay/Fix You/273/X & Y/

Whoops ... la codifica urld traduce % 26 in &

Che non è un personaggio consentito. Mistero ;-) risolto

Altri suggerimenti

prova questo: $ config ['uri_protocol'] = " PATH_INFO " ;;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top