Simbolo percentuale nell'URI CodeIgniter
-
06-07-2019 - |
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!
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 " ;;