Help us understand the problem. What is going on with this article?

The URI you submitted has disallowed characters.

More than 3 years have passed since last update.

Codeigniter を利用している人なら一度はぶつかった壁があるかもしれないこのエラー。

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

config/config.php
$config['permitted_uri_chars'] = '一-龠ぁ-んァ-ヴーa-zA-Z0-9a-z 0-9~%.:_-';

に変えるんだそうですが、未だにこれの意義がわからない…。
別に設定変えなくても日本語URL通るんだけど、これはもしかして Chrome がご丁寧にURLエンコードかけているのかしらん?

そんな釈然としないところもあるけど、本題。(っていうか本題すぐ終わっちゃう)

問題は間隔スペースなんだよね。フォームで入力された文字をURLに渡すんだけど、どうも半角スペースが入ると、掲題のエラーが発生。そして、ネットにもコレって言う回避方法が見つからない。

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

こんな荒業もあったけど、こんなことしてセキュアなのか、そもそもこの制限がセキュリティ的に何を寄与しているかもさっぱりわからない。

と、いろいろ調べていくうちにエンコードの歴史的経緯なんて調べてたわけ。
技術/HTTP/URLエンコードで 0x20(スペース) を "+" にすべきか "%20" にすべきか
…なんてゆとり入り口世代には苦痛で読めんわ。これだけ調べあげるってどんだけ暇人だよ。
ホント人類へ貢献ありがとうございました。m(_ _)mカンシャ

そしたら神仕様のスライドショーを発見
お前は PHP の歴史的な理由の数を覚えているのか

最初から笑わせてもらったけど、結論から言うと5つ
PHPの
urlencode() → RFC1738に準じておらず、半角スペースを + に変換
rawurlencode() → RFC1738に準ずるかたちで、半角スペースを %20 に変換

え…?? そうなの?

つーこので、URLに送る前のキーワードをエンコードしてる urlencode()rawurlencode() に変更してみましたところ…。

ああ、通った。

な〜んだ、Codeigniterの解釈は正しかったのね。慣例となっている + は許さず、正しい %20 を通してたという落ちでした。

さらなるオチは、正規表現を理解しようとしない私の問題でし。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away