baserCMS+nginxのその後(App.baseUrlの設定を解決)
nginxでbaserCMSを動かす設定
を以前記事に書きましたが、当方のサーバではinstall.phpのApp.baseUrlを本家の設定とは違う記述に書き換えなければ正常に動作しませんでした。
書き換えなかった際の症状は、baserCMSが書き出すURLの先頭にすべて/index.phpがくっついてしまうというもの。これによってCSSは取得できないわ、画像は表示されないわと散々な状態になっていました。
App.baseUrlの設定を変えるだけで何とかなるということはつまり、サーバー環境変数が原因でbaserCMSによるURLの解析が失敗しているのではないかという検討がつきます。
※baserCMSはシステム管理画面の環境情報を見ればphpinfo()が表示されます。
物凄く怪しい奴がいました。
恐らくこいつが犯人です。
1.フロントコントローラapp/webroot/index.phpに処理を全部ぶん投げる
2.app/webroot/index.phpで各パス(CakeのルートやWebrootなど)を設定し、リクエストされたURLをDispacherに渡す
3.Dispatcher(cake/dispacher.php)のdispatchメソッドでそのURLを解析し、担当のコントローラに処理をぶん投げる
(以下略)
という感じで動いてます。CakePHPのソースを見てみるとDispatcherのbaseUrlメソッドにPHP_SELFの情報が利用されていました。
……なぜ変わらぬ
参考:http://php.net/manual/ja/ini.core.php のcgi.fix_pathinfoの項目
この設定の弊害でPHP_SELFのパスが二重に設定されるなどという事例が検索しているとかなり見つかりました。
今回の環境ではPATH_INFO環境変数はnginxの設定ファイルで直に指定しているので、特に修正されなくても困らないはず。
cgi.fix_pathinfo=0と設定してphp-fpmを再起動すると問題は解消しました。
これで晴れて、baserCMSのマニュアルの通りにinstall.phpに
意外な所が原因でしたね。
もしかしたら古いCakePHP+nginxの組み合わせでも同じ症状が出ることがあるのかもしれません。
を以前記事に書きましたが、当方のサーバではinstall.phpのApp.baseUrlを本家の設定とは違う記述に書き換えなければ正常に動作しませんでした。
Configure::write('App.baseUrl', '/');
書き換えなかった際の症状は、baserCMSが書き出すURLの先頭にすべて/index.phpがくっついてしまうというもの。これによってCSSは取得できないわ、画像は表示されないわと散々な状態になっていました。
App.baseUrlの設定を変えるだけで何とかなるということはつまり、サーバー環境変数が原因でbaserCMSによるURLの解析が失敗しているのではないかという検討がつきます。
環境
- baserCMS 2.1.1
- PHP 5.4.16 (PHP-FPMで動作)
- nginx 1.2.3
- CentOS 6.4
原因の調査
手っ取り早く、他のbaserCMSを運用しているApache環境と環境変数を見比べてみました。※baserCMSはシステム管理画面の環境情報を見ればphpinfo()が表示されます。
物凄く怪しい奴がいました。
$_SERVER['PHP_SELF'] | /index.php/index.php |
恐らくこいつが犯人です。
baserCMS(CakePHP)のソースを読む
baserCMSは1.フロントコントローラapp/webroot/index.phpに処理を全部ぶん投げる
2.app/webroot/index.phpで各パス(CakeのルートやWebrootなど)を設定し、リクエストされたURLをDispacherに渡す
3.Dispatcher(cake/dispacher.php)のdispatchメソッドでそのURLを解析し、担当のコントローラに処理をぶん投げる
(以下略)
という感じで動いてます。CakePHPのソースを見てみるとDispatcherのbaseUrlメソッドにPHP_SELFの情報が利用されていました。
対策
まずはnginxの設定ファイルでPHP_SELFを手動でREQUEST_URIと同じにしてやりました。
$_SERVER['PHP_SELF'] | /index.php/index.php |
……なぜ変わらぬ
結論:php.iniでcgi.fix_pathinfo=0 を設定
結論からいうと、この挙動はphp.ini のcgi.fix_pathinfoの設定によるものでした。実はPHPはPATH_INFOを正しく解釈しないためデフォルトではこの設定を1にしており、正しいCGIの仕様に合わせています。参考:http://php.net/manual/ja/ini.core.php のcgi.fix_pathinfoの項目
この設定の弊害でPHP_SELFのパスが二重に設定されるなどという事例が検索しているとかなり見つかりました。
今回の環境ではPATH_INFO環境変数はnginxの設定ファイルで直に指定しているので、特に修正されなくても困らないはず。
cgi.fix_pathinfo=0と設定してphp-fpmを再起動すると問題は解消しました。
これで晴れて、baserCMSのマニュアルの通りにinstall.phpに
Configure::write('App.baseUrl', '');と書いて動作させることができました。
意外な所が原因でしたね。
もしかしたら古いCakePHP+nginxの組み合わせでも同じ症状が出ることがあるのかもしれません。