CodeIgniter URI yüzde Sembol

1 Cevap php

Ben bir CodeIgniter denetleyicisi kodlanmış bir dize geçmek gerekir.

Example:

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

Benim sorunum izin verilmeyen bir karakter yüzde sembolüdür. Ben aşağıdaki ile config dosyasını değiştirmek denedim:

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

+ Tamam, ama % geçerli değil. Eğer % sembolü sağlayacaktır yüzden beni bu reg exp değiştirmek için yardımcı olabilir misiniz? Şimdiden teşekkürler!

1 Cevap

Aksi takdirde aralığı olarak yorumlanır alır dizenin sonundaki "-" koydu. Gördüğünüz gibi% izin verilen karakter listesinde zaten.

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


Ahem ... tekrar örnek dize baktıktan sonra. Eğer "The URI you submitted has disallowed characters" olsun neden burada olduğunu.

Short explanation: ampersanı & izin karakterler listesine ekle

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


Long explanation

Birlikte oynarken 2 şey vardır.

A) CodeIgniter izin verilmeyen karakterler için tüm URI segments denetler. Bu izin verilen karakterleri beyaz liste ile olur. Olanları izin verilen $config['permitted_uri_chars'] değişkene / system/application/config/config.php kontrol edilebilir. Varsayılan değer 'a-z 0-9~%.:_-' gibi bir şey ayarlanır. Böylece z, uzay, tüm numaraları ve aşağıdaki karakterleri ~%.: bir bütün harfler - izin verilir.

Tamam bize eserlerini söylemek size örnek URI bu karşılaştırma yapalım

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

Tüm karakterler Tamam ... ama artı işareti + konuda ne beklemek? Bu izin verilen karakter listesinde değil! Ve henüz URI hakkında şikayet değil mi? Bu sorunun anahtarıdır.

B) CodeIgniter urldecodes önce birisi sadece URI urlkodçözümü tarafından kontrol circumvents bunu önlemek için beyaz liste-karakter-kontrol etmek için URI kesimleri. Bu durumda, + bir boşluk için çözülür alır. Bu davranış, urlencode (RFC 1738 sapma, + işareti olarak boşluk kodlayan) taşımaktadır. + işareti izin açıklıyor.

Bu özel URI neden çalışmıyor kombine Bu iki şey de açıklayabilir.

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

Tüh ... urlkodlamasig %26 bir & çevirir

Hangi bir izin karakter değildir. Mistery ;-) çözüldü