user icon

CakePHPのRouter::normalizeにヤラれる

あるいは認証後に存在しないsコントローラーに飛ばされてエラーになる件。

1.3.6での話なのですが、例えば

http://lancard.com/hoge/

というCakePHPで構築したサイトがあってAuthで認証を行っているとします。
そこにhogesコントローラーがあったとしましょう。そのindexアクション

http://lancard.com/hoge/hoges/

で認証切れすると戻り先のUrlとしてAuth.redirectセッションに/hogesが
保持されるのですが、この状態で認証して再ログインすると

http://lancard.com/hoge/s

に飛ばされる不思議現象。 犯人はRouter::normalize。

リダイレクト処理時にRouter::normalizeで前処理されるのですがその中に

if (!empty($paths['base']) && stristr($url, $paths['base'])) {
    $url = preg_replace('/^' . preg_quote($paths['base'], '/') . '/', '', $url, 1);
}

というコードがあって、結果、Router::normalize('/hoges')は/sを返しやがります。

if (!empty($paths['base']) && stristr($url, $paths['base'] . '/')) {
    $url = preg_replace('/^' . preg_quote($paths['base'], '/') . '/', '', $url, 1);
}

と改造して$paths['base']の後ろに/がある時だけ置換するようにして対処しました。
悪影響がないことを祈りつつ。

なるべくならフレームワークに手を入れるのは避けたいところ。いい手があったら教えてください。

Facebooktwitterlinkedintumblrmail

タグ:

コメントは受け付けていません。