こなさんち

しがないフリーランスエンジニアの備忘録。

faviconがsessionにいるせいで半日潰れた

■現象

hoge.com/[controller]/[action]/[parameter]

でGETパラメーターでアクセス。 入力フォームで登録情報を入力してもらうページ。

何も入力せずEnter。

リダイレクト先が

hoge.com/[controller]/[action]/favicon.ico

になってた。

■追求

validationを掛けているので、FormRequestを継承したrequestのphpファイルを

php artisan make:request CompanyRequest

みたいに作るのよ。

ははーん、validateが失敗したときのリダイレクト先が変なんだな??

これを機会にちょっとソースをほじくるぞ。

まず、 vender/laravel/framework/src/illuminate/Foundation/Http/FormRequest.php が元だね。こんなに階層潜るのか。

protected function failedValidation(Validator $validator)
    {
        throw (new ValidationException($validator))
                    ->errorBag($this->errorBag)
                    ->redirectTo($this->getRedirectUrl());
    }

はいはい、 getRedirectUrl() ね。。

protected function getRedirectUrl()
    {
        $url = $this->redirector->getUrlGenerator();
        
        if ($this->redirect) {
            return $url->to($this->redirect);
        } elseif ($this->redirectRoute) {
            return $url->route($this->redirectRoute);
        } elseif ($this->redirectAction) {
            return $url->action($this->redirectAction);
        }
        
        return $url->previous();
    }

...redirector ?????

vender/laravel/framework/src/illuminate/Routing/UrlGenerator.php

にいるね、うんうん。このクラスだね。

getPreviousUrlFromSession

ここらへんから怪しいよね、session???って。 都度都度dd()で吐き出してるけど、結局パラメータがfavicon.icoになってる。

■解決?

なんでfaviconがSessionにいるんだよおあああああああああああああああああああああああああああああ

まさか、まさか、と思い、htmlのheadタグ内からfavicon.icoを消したら 正しいURLになってた…

はあ?!って叫びました。

もう嫌!ってなりかけてたけど、ここで諦めたら駄目だと無駄なプライドが意地張ってました。

■解決!

…。

<link rel="shortcut icon" href="favicon.ico">

…。…これが悪い…?…パス…?でもブラウザには表示されてるし…、firefoxだと平気だし、問題はchoromeちゃんだけだし…

<link rel="shortcut icon" href="/favicon.ico">

…ああああああああああああ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!できた!!!!!!!!!!

■根本解決? には至らず。

調べたところ、Chromeだけの現象のようです。

faviconのパスをちゃんと「頭から」指定してあげないと、sessionに上書きされて、laravelやcakePHPのsessionにある _previous というリダイレクト先が上書きされてしまう様子。 また、favicon.icoのみならず、ドキュメントルート以下の画像、css、jsファイルも同様の現象が起きている模様です。

はあ…疲れた。寝ます。

いい機会でした。

見てくれた皆さんは、くれぐれもパスには注意しましょう。

P.S. 仲間がいました。

Laravel バリデーションが変な場所へリダイレクトしてしまう – console dot log

www.kaasan.info

ほーらやっぱり!!!!!!!!!