# Nunca sirvas credenciales, documentación interna ni metadatos de git.
# La configuración va en archivos .php (que el servidor ejecuta y devuelven
# vacío), así que esto es una segunda barrera, no la única.
<FilesMatch "^(\.env.*|\.git.*|LEEME\.txt|.*\.md)$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>

# --- PWA -------------------------------------------------------------------
# Apache no conoce .webmanifest de fábrica y lo sirve como texto plano; sin el
# tipo correcto Chrome ignora el manifiesto y el tablero no se puede instalar.
<IfModule mod_mime.c>
    AddType application/manifest+json .webmanifest
    AddType image/svg+xml            .svg
</IfModule>

# El service worker NO se cachea: si el navegador sirve una copia vieja, el
# tablero se queda clavado en la versión anterior aunque se publique otra.
<FilesMatch "^sw\.js$">
    <IfModule mod_headers.c>
        Header set Cache-Control "no-cache, no-store, must-revalidate"
        Header set Service-Worker-Allowed "/"
    </IfModule>
</FilesMatch>

# El resto de assets llevan ?v= en la URL, así que se pueden guardar mucho
# tiempo: cuando cambian, cambia el enlace.
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/css              "access plus 1 year"
    ExpiresByType application/javascript "access plus 1 year"
    ExpiresByType image/png             "access plus 1 year"
    ExpiresByType image/svg+xml         "access plus 1 year"
    # El manifiesto sí se revisa seguido: es barato y cambia el nombre/iconos.
    ExpiresByType application/manifest+json "access plus 1 day"
</IfModule>
