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
ほーらやっぱり!!!!!!!!!