Dietcube を試す、Dietcube を試す その2の続きです。
一通りDietcubeで開発して、テスト環境(PHPビルトインWebサーバ)での動作チェックもして、いざサーバにデプロイをしてみたところ……「404 Not found」の表示になってしまいました……。
内部的には
[yyyy-MM-dd hh:ii:ss] app.ERROR: Error occurred. {"error":"Dietcube\\Exception\\HttpNotFoundException","message":"404 Not Found"} []
のエラーです。また、アプリケーションはルーティングも行っているため、https://example.jp/
だけでなくhttps://example.jp/hoge/fuga
のようなURLも受け入れられなければなりません。
最初はサブディレクトリで試験したのですが、さすがに最初からそれでは上手く行かないだろう、と思い直してディレクトリ構造を見直しました。
最初はどこをどうすれば良いかも分からなかったのですが、検索したらCreate Project and Configuration – Dietcube Documentationというページに「webroot
directory」という記載があって設定が記述されていたのでそれを参考にしました。
/ # 仮想サイトのDocumentRoot
├ app/
│ ├ Controller/
│ ├ config/
│ ├ Service/
│ ├ template/
│ ├ Application.php
│ └ Route.php
├ tmp
└ webroot
├ css/
│ └ css群
├ img/
│ └ jpgやpngの画像
└ index.php
このような構造で、以下の.htaccess
を仮想サイトのDocumentRootに配置しました。
RewriteEngine On
RewriteBase /webroot/
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule index.php - [QSA,L,C]
RewriteRule (.*) - [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} \.(css|js|jpg|jpeg|gif|png|svg|ico)$
RewriteCond %{REQUEST_FILENAME} !^(.*)(webroot)+(.*)$
RewriteRule ^(.*)$ /webroot/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
期待としては
https://example.jp/
へのアクセスはhttps://example.jp/webroot/index.php
で処理- cssやJS、画像などのサブリソース、例えば
https://example.jp/css/hoge.css
はhttps://example.jp/webroot/css/hoge.css
にアクセス
という形を想定していたのですが、トップページは確かに処理されるものの、サブリソースが404になってしまいました。
最終的にはサブリソースは直下に置く形に妥協しました。
/ # 仮想サイトのDocumentRoot
├ app/
│ ├ Controller/
│ ├ config/
│ ├ Service/
│ ├ template/
│ ├ Application.php
│ └ Route.php
├ tmp
├ webroot
│ └ index.php
├ css/ # 移動
│ └ css群
└ img/ # 移動
└ jpgやpngの画像
.htaccess
はほぼ上述のApacheの設定の通りに直して、以下のようにしました。
RewriteEngine On
RewriteBase /webroot/
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule index.php - [QSA,L,C]
RewriteRule .* - [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
これでひとまず動作することは確認。やや納得が行かない形ではありますが……。