Options -Indexes
DirectoryIndex index.php
# ---- Protect private data (also works if the data/ .htaccess is missing) ----
RedirectMatch 404 ^/(data|\.git)(/|$)
<FilesMatch "(^\.|\.(json|log|old|tmp|lock)$|^lib\.php$|^README\.txt$)">
  Require all denied
</FilesMatch>
<FilesMatch "^(settings|config)\.json$"><IfModule !mod_authz_core.c>Deny from all</IfModule></FilesMatch>
# ---- No PHP in uploads ----
<IfModule mod_headers.c>
  Header always set X-Content-Type-Options "nosniff"
  Header always set X-Frame-Options "DENY"
  Header always set Referrer-Policy "strict-origin-when-cross-origin"
  Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
  Header always set Cross-Origin-Opener-Policy "same-origin"
  Header always set X-Permitted-Cross-Domain-Policies "none"
  <FilesMatch "\.(css|js|jpg|jpeg|png|webp|svg)$">
    Header set Cache-Control "public, max-age=2592000, immutable"
  </FilesMatch>
</IfModule>
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json
</IfModule>
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType image/webp "access plus 30 days"
  ExpiresByType image/jpeg "access plus 30 days"
  ExpiresByType image/png "access plus 30 days"
  ExpiresByType text/css "access plus 30 days"
  ExpiresByType application/javascript "access plus 30 days"
</IfModule>
