Options -Indexes

# index.php / index.html à la racine, puis réécriture vers public/
DirectoryIndex index.php index.html

# Fichiers sensibles par extension (défense en profondeur si la racine projet est le DocumentRoot)
<IfModule mod_authz_core.c>
    <FilesMatch "(^\.|\.env$|\.key$|\.pem$|\.crt$|\.ini$|\.log$|\.sql$|\.sqlite$|\.db$|settings\.json$|settings\.example\.json$|old-settings\.json$)">
        Require all denied
    </FilesMatch>
</IfModule>
<IfModule !mod_authz_core.c>
    <FilesMatch "(^\.|\.env$|\.key$|\.pem$|\.crt$|\.ini$|\.log$|\.sql$|\.sqlite$|\.db$|settings\.json$|settings\.example\.json$|old-settings\.json$)">
        Order allow,deny
        Deny from all
    </FilesMatch>
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Refuser l'accès HTTP direct aux dossiers internes (hors web public)
    RewriteRule ^(?:config|includes|sql|data|storage|logs|tools|tests|vendor)(?:/|$) - [F,L]
</IfModule>

# Complément si mod_rewrite indisponible ou règles ignorées
<IfModule mod_alias.c>
    RedirectMatch 403 ^/(config|data|storage|logs|tools|tests|vendor|sql|includes)(/|$)
</IfModule>

<IfModule mod_rewrite.c>
    # Racine du projet → public/
    RewriteRule ^$ public/ [L]
    RewriteRule ^(?!public/|api/)(.*)$ public/$1 [L]
</IfModule>

# Timeouts PHP longs (génération tutoriel LLM / SSE) — ignoré si non autorisé par l'hébergeur
<IfModule mod_php.c>
    php_value max_execution_time 0
    php_value max_input_time 600
</IfModule>

<IfModule mod_php8.c>
    php_value max_execution_time 0
    php_value max_input_time 600
</IfModule>

<IfModule mod_headers.c>
    Header set Connection keep-alive
</IfModule>
