CodeIgniter 4 htaccess i redirect

CI4 pojawił się już chwilę temu, o czym pisałem tutaj . Najbardziej upierdliwa jest początkowa konfiguracja, która zakłada że trzymamy wszystko poza public_html. Ma to sens, ale nie wszędzie jest to możliwe – a na pewno w moim środowisku developerskim wygodniej jest mi trzymać zadany projekt w jednym folderze.

Przedstawię tutaj szybką konfigurację i przykładowe .htaccess, które pozwolą odpalać projekty po staremu. Jak dokładnie – a tak, że mamy dostęp do projektu przez folder np.: http://localhost/projekt a całość jest plików jest serwowowana np. z folderu ./root/projekt.

Zaczynamy od pobrania composera, a następnie odpalamy:

./composer.phar create-project codeigniter4/appstarter projekt

Oczywiście odpalamy to w folderze /root dzięki temu nasz appstarter zainstaluje się w folderze /root/projekt.

Potem zaczyna się zabawa. W folderze projekt tworzymy plik .htaccess o takiej treści:

SetEnv CI_ENVIRONMENT development
RewriteEngine On
RewriteBase /projekt/

RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]

RewriteRule ^((?!public/).*)$ public/$1 [L,NC]

W tym folderze musimy też dodać plik .env

app.baseURL = 'http://localhost/projekt/'
app.indexPage = ''
app.uriProtocol = 'PATH_INFO'

I teraz jak klikniemy http://localhost/projekt/home/index to otworzy nam się kontroler Home i metoda Index . Niestety domyślny kontroler, który powinien ładować się po wejściu na http://localhost/projekt/ wywala na błąd:

Controller or its method is not found: \App\Controllers\Projekt::index

Można temu zaradzić na dwa sposoby. Pierwszy to utworzenie “brakującego” kontrolera, albo zmiana Home.php na Projekt.php – drugi jest łatwiejszy. Do pliku app/Config/Routes.php dopisujemy nową regułę:

$routes->get('/projekt/', 'Home::index');

Dlaczego domyślny routing nie działa – nie wiem. Dla projektu umieszczonego w głównym folderze, lub kierowania dokument root na /public – problem nie występuje.