7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

The URI you submitted has disallowed characters.

Last updated at Posted at 2016-07-28

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 を通してたという落ちでした。

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

7
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?