# ═══════════════════════════════════════════════════════════════════════
# Sistema GPS — configuracion de Apache y proteccion del sitio
#
# No lleva rutas fijas: funciona igual en http://localhost/gps que en la
# raiz del dominio contratado, sin editar nada.
# ═══════════════════════════════════════════════════════════════════════

# No mostrar el contenido de las carpetas
Options -Indexes

<IfModule mod_rewrite.c>
    RewriteEngine On

    # ─── .git ────────────────────────────────────────────────────────
    # Sin esto se puede descargar el historial completo del proyecto y con
    # el, el archivo de configuracion con la contrasena de la base de datos.
    RewriteRule (^|/)\.git(/|$) - [F,L]

    # Carpetas que nunca deben abrirse desde el navegador
    RewriteRule ^includes/  - [F,L]
    RewriteRule ^cron/      - [F,L]
    RewriteRule ^backups/   - [F,L]
    RewriteRule ^lib/       - [F,L]

    # ─── El instalador ───────────────────────────────────────────────
    # Solo sirve para montar el sistema la primera vez. Dejarlo abierto
    # despues permitiria rehacer la instalacion y crearse un usuario
    # administrador nuevo.
    #
    # Se cierra solo: en cuanto la instalacion termina, el instalador deja
    # el archivo install/instalado.lock, y a partir de ese momento esta
    # regla empieza a bloquear la carpeta. Antes de instalar tiene que
    # poder abrirse, si no el instalador nunca correria.
    #
    # De todos modos, BORRA la carpeta install/ cuando acabes de instalar.
    RewriteCond %{DOCUMENT_ROOT}/install/instalado.lock -f [OR]
    RewriteCond %{DOCUMENT_ROOT}/includes/config.php -f
    RewriteRule ^install/   - [F,L]
</IfModule>

# ─── Archivos que no deben servirse nunca ───────────────────────────────
<FilesMatch "(?i)\.(sql|log|bak|old|ini|sh|bat|md|conf|yml|yaml|lock|env)$">
    Order allow,deny
    Deny from all
</FilesMatch>

# Archivos ocultos (.env, .htaccess, .DS_Store…)
<FilesMatch "^\.">
    Order allow,deny
    Deny from all
</FilesMatch>

# Copias que dejan los editores de texto
<FilesMatch "(~|\.swp|\.swo|\.tmp)$">
    Order allow,deny
    Deny from all
</FilesMatch>

# ─── Cabeceras de seguridad ─────────────────────────────────────────────
<IfModule mod_headers.c>
    # No revelar la version de PHP: le diria a un atacante que fallas buscar
    Header always unset X-Powered-By
    Header unset X-Powered-By
    # Evita que el navegador adivine el tipo de archivo
    Header set X-Content-Type-Options "nosniff"
    # Impide que el sitio se muestre dentro de un marco en otra pagina
    Header set X-Frame-Options "SAMEORIGIN"
    Header set X-XSS-Protection "1; mode=block"
    # No mandar la direccion completa al salir a otro sitio
    Header set Referrer-Policy "strict-origin-when-cross-origin"
    # El sistema no necesita camara, microfono ni ubicacion
    Header set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=()"

    # Cuando el dominio ya tenga certificado, esta linea obliga a HTTPS.
    # Descomentala DESPUES de comprobar que https funciona bien.
    # Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>

# ─── Forzar HTTPS ───────────────────────────────────────────────────────
# Descomenta estas cuatro lineas cuando el dominio ya tenga certificado SSL.
# <IfModule mod_rewrite.c>
#     RewriteCond %{HTTPS} off
#     RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# </IfModule>

# ─── Ajustes de PHP ─────────────────────────────────────────────────────
# expose_php off tambien quita la version de la cabecera, cuando el hosting
# permite cambiarlo desde aqui.
<IfModule mod_php7.c>
    php_value upload_max_filesize 10M
    php_value post_max_size 12M
    php_value max_execution_time 60
    php_flag  display_errors off
    php_flag  expose_php off
</IfModule>
<IfModule mod_php8.c>
    php_value upload_max_filesize 10M
    php_value post_max_size 12M
    php_value max_execution_time 60
    php_flag  display_errors off
    php_flag  expose_php off
</IfModule>
<IfModule mod_php.c>
    php_value upload_max_filesize 10M
    php_value post_max_size 12M
    php_value max_execution_time 60
    php_flag  display_errors off
    php_flag  expose_php off
</IfModule>
