Pergunta

Eu preciso passar uma string codificada para um controlador CodeIgniter.

Exemplo :

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

O meu problema é o símbolo por cento que é um caractere não permitido. Eu tentei mudar o arquivo de configuração com o seguinte:

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

O + é ok, mas o % não é válido. Você pode me ajudar a mudar esta exp reg por isso vai permitir que o símbolo %? Agradecemos antecipadamente!

Foi útil?

Solução

Coloque o " - " no final da corda caso contrário ele é interpretado como gama. O% já está na lista de caracteres permitido como você pode ver.

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

Aham ... depois de olhar para a sua cadeia de amostra novamente. Aqui é por isso que você começa "The URI you submitted has disallowed characters".

Breve explicação : Adicione o comercial & para a lista de caracteres permitidos

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

explicação longa

Existem 2 coisas que brincam juntos.

A) cheques Mercante todos os URI segmentos para caracteres não permitidos. Isso acontece por whitelisting caracteres permitidos. Quais são permitidas pode ser verificado in / system / application / config / config.php na variável $config['permitted_uri_chars']. O valor padrão é definido como algo como 'a-z 0-9~%.:_-'. Assim, todas as letras de A a Z, espaço, todos os números e os caracteres * ~%:.. São permitidos _-

Ok, vamos comparar isso com sua amostra URI que você diz obras

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

Todos os personagens são ok ... mas esperar o que acontece com o sinal de adição + ? Não é na lista de caracteres permitidos! E ainda o URI não se queixaram? Esta é a chave para o seu problema.

B) urldecodes os segmentos URI antes da lista branca caracteres -check para evitar que alguém contorna a verificação simplesmente URLEncoding a URI. Assim, o + fica decodificado para um espaço. Esse comportamento é por causa de urlencode (que codifica espaços como + sinal, desviando RFC 1738 ). Isso explica por que o + sinal é permitido.

Estas duas coisas combinadas explicar também por que esse URI específico não funciona.

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

Whoops ... o urldecoding traduz % 26 para um &

Que não é um caractere permitido. Mistery ;-) resolvido

Outras dicas

tente o seguinte: $ Config [ 'uri_protocol'] = "PATH_INFO";

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top