# Bloquea el acceso directo por HTTP a archivos sensibles que no deben
# servirse nunca, sin importar que existan en el document root.

# Cualquier "dotfile" (.env, .git*, .htaccess mismo, etc.)
<FilesMatch "^\.">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>

# Archivos de configuración / datos que no deben descargarse directamente.
# OJO: .json queda fuera a propósito -- manifest.json de la PWA debe poder
# servirse, y Apache combina con AND (no "el último gana") los Require de
# distintos <FilesMatch>/<Files> que apliquen al mismo archivo, así que un
# bloque separado para "permitir manifest.json" no es fiable aquí.
<FilesMatch "\.(sqlite|sqlite3|db|sql|log)$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>

# Manifiestos de Composer sueltos en la raíz -- revelan las dependencias y
# sus versiones exactas (el directorio vendor/ ya se bloquea con su propio
# .htaccess, pero composer.json/.lock viven fuera de vendor/).
<FilesMatch "^composer\.(json|lock)$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>

# Cabeceras de seguridad. HSTS, nosniff y X-Frame-Options no venían seteadas
# por la app ni por el edge de Hostinger (solo agrega su propio CSP mínimo);
# se agregan aquí porque .htaccess es lo único que controlamos a ese nivel.
<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    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"
</IfModule>

Options -Indexes
