繼上篇安裝及設定 Caddy2 網頁伺服器,完成 http/3 服務後,接下來設定 CodeIgniter 4 的使用環境。
來基隆之後,自己習慣使用 CodeIgniter 4(CI4)來作網站開發。CI4 是蠻流行的 PHP 框架,以自已的經驗真的很好用而且快速,而且因為我的案子基本上都是設定在差不多的族群,所以在基礎的資料庫架構及部份基本功能都一樣,可以直接做成 Model 和 Controller,下一個案子直接複制過去就可以了。
Apache2 設定
以往伺服器是用 Apache2 架的,在網站的設定上只須要設定 Alias 和 Directory 即可,rewrite 的部份由 CI4 自帶的 .htaccess 完成。例如將 CI4 的網站 composer 在 /var/www/ci4 路徑中:
Alias /ci4 "/var/www/ci4/public"
<Directory "/var/www/ci4/public">
Options -Indexes
AllowOverride All
<Limit GET POST>
Require all granted
</Limit>
</Directory>
因為自已的程式還沒有開始使用 CRUD 類似 API 的作法,所以都習慣會作 Limit GET POST 去限制客戶端的 method。
Caddy2 設定
Caddy2 的設定忙了好久,總算是搞懂差不多了。
作為伺服器的主網站
將 CI4 的網頁設定成伺服器的主網站只需要在主要的 root 上設定即可。
有些論壇網站上的資料說還要設定 try_files {path} {path}/ /index.php{path},實作後發現不需要,網站也可以正常運作。
作為伺服器的子目錄網站
伺服器只有一台,而要作的案子好幾個,所以要在同一台伺服器下塞進去多個網站,作法就是用子目錄來作區分。
在 Apache2 伺服器上只需要設定 Alias 和 Directory 即可。但是在 Caddy2 上設定 handle 或 handle_path 一直不成功,會出現 404 的訊息。
但是這個 404 頁面和伺服器原生的 404 訊息不同,是由 CI4 產生的。表示其實 CI4 的程式是有執行,但是發生某種檔案找不到的問題。
這個問題找了好久,加上 Caddy2 太新,網路上的論壇資料不多,而且 Caddy2 的 local log 又太簡陋,差一點就放棄了。
後來在重新翻閱 CI4 的官方說明中,發現自已以往不會使用的功能:.env(環境值設定)。CI4 有提供快速設定運作環境 .env 檔案,我之前都是直接修改 /app/Config/ 下的各個設定檔。
先把網頁目錄中的 env 檔複製成 .env,在裡面設定 CI_ENVIRONMENT = development。把運作環境設定成開發模式(development),CI4 會在錯誤畫面中顯示更多的資訊。
例如子網站 /testci4,程式位置 /var/www/testci4,Caddy2 的設定:
使用 handle_path 設定網頁路徑,用 root 指定程式起始位置。使用子目錄需要設定 try_files。此時網站還不能正常使用,會出現404的訊息。
錯誤的原因是因為在 Caddy2 的環境中,系統網址路徑會帶著 /testci4/abc,和原本的 Apache2 只傳遞 /abc 的方式不同,所以 CI4 會去找 Controller/testci4/abc 的 Controller,所以會找不到。找了幾種方式要消除 /testci4 路徑,還沒有成功。
所以要解決這個錯誤,只需要在 app/Config/Routers.php 中手動設定 Router 就可以了。
嚴格設定 Router 是保障網站安全性的指引之一,但是以前為了方便和懶,都是使用 AutoRouting 的功能,現在看來以後不能再那麼隨便了。
留言
張貼留言