# .htaccess (docroot) — Entrada de la API externa, caché de los assets, límites
# de subida y archivos que no se sirven.
#
# Cinco mecanismos que Apache no hace por sí solo. Los que dependen de un
# módulo van dentro de un <IfModule>: donde falte, el archivo es inocuo en vez
# de un error 500.
#
# 1. LA CABECERA Authorization.
#    Con PHP-CGI/FastCGI, Apache y LiteSpeed NO se la entregan a PHP: la
#    consideran suya y se la quedan. Se reenvía por dos caminos porque ninguno
#    de los dos está siempre disponible: mod_setenvif la copia a
#    HTTP_AUTHORIZATION, y mod_rewrite la copia con [E=HTTP_AUTHORIZATION:…],
#    que tras la reescritura interna llega a PHP como REDIRECT_HTTP_AUTHORIZATION.
#    v1KeyFromRequest() (src/api/v1.php) mira los dos nombres, más
#    apache_request_headers() y, como salida de emergencia, X-API-Key —que
#    ningún servidor retiene, porque no es una cabecera de autenticación.
#
# 2. LAS RUTAS LIMPIAS /api/v1/<ruta>.
#    Se reescriben a api/v1/index.php/<ruta>, que es lo que rellena PATH_INFO.
#    Sin mod_rewrite la forma larga /api/v1/index.php/<ruta> sigue funcionando
#    igual: es la alternativa documentada, no un modo degradado.
#    Sin RewriteBase y con patrón y sustitución RELATIVOS, para que valga tanto
#    en la raíz del dominio como bajo un subdirectorio
#    (http://localhost/Presenter/public/). El (?!index\.php) evita reescribir
#    una petición que YA trae index.php delante, y con ello el bucle
#    api/v1/index.php/index.php/…
#
# 3. LA CACHÉ DE LOS ASSETS, que es UNA SOLA PIEZA con el versionado del HTML.
#    El HTML enlaza cada js/css con su huella (?v=…) y versiona también los
#    import internos de los módulos ES a través del import map. Por eso el HTML
#    viaja con no-cache (transporta las versiones: tiene que estar al día) y
#    los js/css se cachean un año (es seguro: cuando un archivo cambia, cambia
#    su huella, y con ella la URL que pide el navegador).
#    LAS DOS MITADES SE SOSTIENEN LA UNA A LA OTRA. Cachear el HTML congelaría
#    las versiones y nadie volvería a ver un cambio; quitar el max-age de los
#    js/css tiraría por la borda el versionado y volvería a pedirlo todo en
#    cada carga. Si tocas una mitad, toca la otra.

# 4. LOS LÍMITES DE SUBIDA con Apache y mod_php (XAMPP y algún hosting).
#    PHP aplica upload_max_filesize y post_max_size antes de ejecutar
#    api/files.php, así que un .pptx que cabe en maxPptxBytes se rechaza igual
#    si el servidor viene con los 2M/8M de serie. Con PHP en CGI/FastCGI/FPM o
#    LiteSpeed —casi todo hosting— estas directivas no se usan: ahí manda
#    public/.user.ini, que dice lo mismo. El <IfModule> es lo que evita el
#    error 500 donde no hay mod_php.

# 5. LOS ARCHIVOS DE CONFIGURACIÓN NO SE DESCARGAN.
#    Apache esconde por su cuenta los .ht*, pero no un .user.ini ni un php.ini:
#    los serviría como texto plano, con las rutas y la versión de PHP dentro.
#    Esto no necesita <IfModule>: Require es del núcleo de Apache 2.4.

DirectoryIndex index.php index.html

<FilesMatch "^(\.user\.ini|php\.ini|\.env)$">
    Require all denied
</FilesMatch>

<IfModule mod_php.c>
    php_value upload_max_filesize 1000M
    php_value post_max_size 72M
</IfModule>
<IfModule mod_php7.c>
    php_value upload_max_filesize 1000M
    php_value post_max_size 1000M
</IfModule>

<IfModule mod_setenvif.c>
    SetEnvIf Authorization "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^api/v1/(?!index\.php)(.*)$ api/v1/index.php/$1 [L,QSA]
</IfModule>

<IfModule mod_headers.c>
    <FilesMatch "\.html$">
        Header set Cache-Control "no-cache"
    </FilesMatch>
    <FilesMatch "\.(js|css)$">
        Header set Cache-Control "public, max-age=31536000, immutable"
    </FilesMatch>
</IfModule>
