Это условие проблемы:
RewriteCond %{REQUEST_URI} !^/
Вы говорите, что все, что начинается с '/', не переписывается, и все начинается с '/'. Вам нужно использовать $
в конце:
RewriteCond %{REQUEST_URI} !^/$
Я не уверен, что вам вообще нужно правило, потому что, если index.html существует, другие два правила позаботятся об этом автоматически. Просто используйте их, чтобы переписать все, что не существует физически:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ app/webroot/$1 [L,QSA]
И вы можете обработать ошибку 404 в своем приложении, так как вам все равно придется обращаться к подкаталогам.