備忘録:cakephp2.xでSSL化した場合のトラブル「The request has been black-holed」の対処
2018年6月30日Linux Tips, テクニカル, トピックス, ノウハウ
今年は7月からGoogle Chromeブラウザの非httpsなサイトをSSL化するための仕事で大忙し。 よくある問題は何かと言うと、表題の「The request has been black-holed」がcakephpで作られた環境でSSL化すると頻発するアクシデントに見舞われる。 この問題はよくある既知の問題なのでネット上にも対処方法はそこそこ見つけることができる。
しかし、人それぞれ、独特の作りかたをしているため、他人のソースコードを読み取って適材適所にコードを埋め込んだり修正するのは大変。 もう、cakephp絡みで今月に入ってから5件の案件で遭遇した。短い時間で修正すべきソースコードとその箇所を見つけるのはなかなかしんどい。
ということで、また遭遇するだろうからメモを残しておく。
対象Controllerを修正する
概ね以下のようなコードを挿入する。システムの作り方によるが修正箇所は大抵「app/Controller/」「app/Plugin/Admin」の下にあるメインコントローラか、機能単位のコントローラに入れることになるだろう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public $components = array( 'Security' ); public function beforeFilter() { parent::beforeFilter(); $this->Security->blackHoleCallback = 'blackhole_threw'; if( ログインユーザ判定やURIパスで判定しセキュリティオフ対象を絞りこむ){ //ブラックホールにならないようにセキュリティチェックを解除 $this->Security->validatePost = false; $this->Security->csrfCheck = false; } // その他の処理 } // BlackHoleになった場合スルーさせる処理 public function blackhole_threw($type) { //何もしないでスルー } |
cakephpのSSL化でインターナルサーバエラーの場合の回避策の一つapp/Config/core.phpの編集でエラーレベルを抑制
php.iniで既にエラーレベルが「E_ALL & ~E_DEPRECATED & ~E_STRICT」に設定されてれば問題ないが、サーバ上にある特定のアプリのみ制御するならcakephpであれば下記を修正します。
1 2 3 4 5 |
Configure::write('Error', array( 'handler' => 'ErrorHandler::handleError', 'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT, 'trace' => true )); |