Options -Indexes
RewriteEngine On

# Force clean old URLs: /index.php/... -> /...
RewriteCond %{THE_REQUEST} \s/+(.*/)?index\.php[?/\s] [NC]
RewriteRule ^(.*/)?index\.php/?(.*)$ /$1$2 [R=301,L,NE]

# Hide .php extension in browser URL
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[?\s] [NC]
RewriteRule ^(.+?)\.php$ /$1 [R=301,L,NE]

# Public home: domain.com/ -> domain.com/public/
RewriteRule ^$ public/ [R=302,L]

# Serve extensionless PHP files in all app folders
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L,QSA]

# Fallback for public clean URLs
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/public/
RewriteRule ^public/(.*)$ public/index.php [L,QSA]

# Fallback for admin clean URLs
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/admin/
RewriteRule ^admin/(.*)$ admin/index.php [L,QSA]

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>
