# Flatboard 5 - Configuration Nginx
# Compatible avec Flatboard 5.0.0-rc.2 et supérieur
#
# Instructions d'installation :
# 1. Copiez ce fichier dans /etc/nginx/sites-available/flatboard5
# 2. Créez un lien symbolique : sudo ln -s /etc/nginx/sites-available/flatboard5 /etc/nginx/sites-enabled/
# 3. Ajustez les paramètres ci-dessous (server_name, root, fastcgi_pass)
# 4. Testez : sudo nginx -t
# 5. Rechargez : sudo systemctl reload nginx
#
# IMPORTANT: Pour activer Brotli, vous devez installer le module ngx_brotli :
# - Ubuntu/Debian: sudo apt install libnginx-mod-brotli
# - Ou compiler depuis : https://github.com/google/ngx_brotli
#
# Vérifiez que le module est chargé dans /etc/nginx/nginx.conf :
# load_module modules/ngx_http_brotli_filter_module.so;
# load_module modules/ngx_http_brotli_static_module.so;

server {
    listen 8080;
    listen [::]:8080;
    server_name localhost;
    
    # Redirection HTTP vers HTTPS (recommandé)
    # Décommentez les lignes suivantes si vous utilisez SSL
    # return 301 https://$server_name$request_uri;
    
    # Pour le développement local, utilisez cette configuration sans redirection
    root /var/www/flatboard5;
    index index.php;
    
    # Logs
    access_log /var/log/nginx/flatboard5_access.log;
    error_log /var/log/nginx/flatboard5_error.log;
    
    # Taille maximale des uploads (ajustez selon vos besoins)
    client_max_body_size 50M;
    
    # Timeouts
    fastcgi_read_timeout 300;
    proxy_read_timeout 300;
    
    # ========================================================================
    # COMPRESSION BROTLI/GZIP AVEC DÉTECTION NAVIGATEUR
    # ========================================================================
    # Brotli offre une meilleure compression que Gzip (15-25% plus petit)
    # Le navigateur envoie "Accept-Encoding: br" s'il supporte Brotli
    # Nginx détecte automatiquement via $http_accept_encoding
    
    # Compression Brotli dynamique (si le module ngx_brotli est installé)
    # Le navigateur doit supporter Brotli (Accept-Encoding: br)
    brotli on;
    brotli_comp_level 5;  # 0-11, 5 est un bon compromis
    brotli_min_length 256;  # Ne pas compresser les petits fichiers
    brotli_types
        text/plain
        text/css
        text/javascript
        text/xml
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/xhtml+xml
        application/rss+xml
        application/atom+xml
        image/svg+xml
        font/ttf
        font/otf
        font/woff
        font/woff2;
    
    # Servir les fichiers pré-compressés en Brotli si disponibles
    brotli_static on;
    
    # Compression Gzip (fallback si Brotli non supporté par le navigateur)
    # Le navigateur doit supporter Gzip (Accept-Encoding: gzip)
    gzip on;
    gzip_comp_level 5;
    gzip_min_length 256;
    gzip_vary on;  # Ajoute Vary: Accept-Encoding pour les proxies
    gzip_proxied any;
    gzip_types
        text/plain
        text/css
        text/javascript
        text/xml
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/xhtml+xml
        application/rss+xml
        application/atom+xml
        image/svg+xml
        font/ttf
        font/otf
        font/woff
        font/woff2;
    
    # Servir les fichiers pré-compressés en Gzip si disponibles
    gzip_static on;
    
    # Ne pas compresser les images déjà compressées
    gzip_disable "msie6";  # Désactiver pour IE6 (ancien navigateur)
    
    # ========================================================================
    # PROTECTION DES RÉPERTOIRES
    # ========================================================================
    
    # Protection des répertoires sensibles
    location ~ ^/(app|stockage|cli|tests|vendor)/ {
        deny all;
        return 404;
    }

    # Empêche l'exécution de tout script PHP uploadé.
    # Apache utilise le .htaccess de /uploads/ pour la même règle.
    location ~ ^/uploads/.+\.(php|phtml|phar|phps|php\d+|pht)$ {
        deny all;
        return 404;
    }

    # Protection des fichiers sensibles (sauf dans /uploads/attachments/)
    location ~ \.(json|db|log|md|ini|conf|bak|sql)$ {
        # Autoriser les fichiers dans /uploads/attachments/ (gérés par PHP)
        location ~ ^/uploads/attachments/ {
            # Ces fichiers sont gérés par le contrôleur PHP
            try_files $uri /public/index.php?url=$uri&$args;
        }
        deny all;
        return 404;
    }
    
    # IMPORTANT: Forcer /uploads/attachments/ à passer par le contrôleur PHP
    # Même si le fichier existe, pour gérer les permissions et MIME types
    location ~ ^/uploads/attachments/ {
        try_files $uri /public/index.php?url=$uri&$args;
    }
    
    # Forcer sitemap.xml et robots.txt à passer par le contrôleur PHP
    location = /sitemap.xml {
        try_files $uri /public/index.php?url=/sitemap.xml&$args;
    }
    
    location = /robots.txt {
        try_files $uri /public/index.php?url=/robots.txt&$args;
    }
    
    # Point d'entrée API (supporte les sous-dossiers)
    location ~ /api/ {
        try_files $uri /public/api.php?url=$uri&$args;
    }
    
    # Fichiers statiques (CSS, JS, images, fonts, etc.)
    location ~* \.(ico|css|js|gif|jpe?g|png|svg|woff|woff2|ttf|eot|otf|webp|avif)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
        try_files $uri =404;
    }
    
    # Répertoire public (point d'entrée principal)
    location / {
        # Essayer d'abord de servir le fichier directement
        # Si non trouvé, rediriger vers index.php avec le paramètre url
        try_files $uri $uri/ /public/index.php?url=$uri&$args;
    }
    
    # Point d'entrée API PHP
    location ~ ^/public/api\.php$ {
        # Configuration FastCGI
        # Ajustez selon votre configuration PHP-FPM :
        # - Socket Unix : unix:/var/run/php/php8.3-fpm.sock
        # - TCP : 127.0.0.1:9000
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        
        fastcgi_index api.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        
        # Paramètres FastCGI supplémentaires
        fastcgi_param REQUEST_URI $request_uri;
        fastcgi_param QUERY_STRING $query_string;
        
        # Headers de sécurité
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-XSS-Protection "1; mode=block" always;
    }
    
    # Point d'entrée PHP principal
    location ~ ^/public/index\.php$ {
        # Redirection 301 si quelqu'un accède directement à public/index.php
        if ($request_uri ~ ^/public/index\.php$) {
            return 301 /;
        }
        
        # Configuration FastCGI
        # Ajustez selon votre configuration PHP-FPM :
        # - Socket Unix : unix:/var/run/php/php8.3-fpm.sock
        # - TCP : 127.0.0.1:9000
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        
        # Paramètres FastCGI supplémentaires
        fastcgi_param REQUEST_URI $request_uri;
        fastcgi_param QUERY_STRING $query_string;
        
        # Headers de sécurité
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-XSS-Protection "1; mode=block" always;
        
        # Désactiver les logs pour les fichiers statiques
        access_log off;
    }
    
    # Bloquer l'accès direct à index.php à la racine (si présent)
    location = /index.php {
        return 301 /;
    }
    
    # Bloquer l'accès aux fichiers .htaccess et autres fichiers cachés
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
    
    # Désactiver l'affichage des répertoires
    autoindex off;
}

# Configuration HTTPS (décommentez et configurez si vous utilisez SSL)
# 
# server {
#     listen 443 ssl http2;
#     listen [::]:443 ssl http2;
#     server_name yourdomain.com www.yourdomain.com;
#     
#     root /var/www/flatboard5;
#     index index.php;
#     
#     # Certificats SSL (ajustez les chemins)
#     ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
#     ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
#     
#     # Configuration SSL moderne
#     ssl_protocols TLSv1.2 TLSv1.3;
#     ssl_ciphers HIGH:!aNULL:!MD5;
#     ssl_prefer_server_ciphers on;
#     
#     # HSTS
#     add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
#     
#     # Protection des répertoires sensibles
#     location ~ ^/(app|stockage|cli|tests|vendor)/ {
#         deny all;
#         return 404;
#     }
#
#     # Empêche l'exécution de tout script PHP uploadé.
#     location ~ ^/uploads/.+\.(php|phtml|phar|phps|php\d+|pht)$ {
#         deny all;
#         return 404;
#     }
#
#     # Protection des fichiers sensibles (sauf dans /uploads/attachments/)
#     location ~ \.(json|db|log|md|ini|conf|bak|sql)$ {
#         location ~ ^/uploads/attachments/ {
#             try_files $uri /public/index.php?url=$uri&$args;
#         }
#         deny all;
#         return 404;
#     }
#     
#     # IMPORTANT: Forcer /uploads/attachments/ à passer par le contrôleur PHP
#     location ~ ^/uploads/attachments/ {
#         try_files $uri /public/index.php?url=$uri&$args;
#     }
#     
#     # Forcer sitemap.xml et robots.txt à passer par le contrôleur PHP
#     location = /sitemap.xml {
#         try_files $uri /public/index.php?url=/sitemap.xml&$args;
#     }
#     
#     location = /robots.txt {
#         try_files $uri /public/index.php?url=/robots.txt&$args;
#     }
#     
#     # Point d'entrée API (supporte les sous-dossiers)
#     location ~ /api/ {
#         try_files $uri /public/api.php?url=$uri&$args;
#     }
#     
#     # Fichiers statiques
#     location ~* \.(ico|css|js|gif|jpe?g|png|svg|woff|woff2|ttf|eot|otf|webp|avif)$ {
#         expires 1y;
#         add_header Cache-Control "public, immutable";
#         access_log off;
#         try_files $uri =404;
#     }
#     
#     # Répertoire public (point d'entrée principal)
#     location / {
#         try_files $uri $uri/ /public/index.php?url=$uri&$args;
#     }
#     
#     # Point d'entrée API PHP
#     location ~ ^/public/api\.php$ {
#         fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
#         fastcgi_index api.php;
#         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#         include fastcgi_params;
#         fastcgi_param REQUEST_URI $request_uri;
#         fastcgi_param QUERY_STRING $query_string;
#         
#         add_header X-Content-Type-Options "nosniff" always;
#         add_header X-Frame-Options "SAMEORIGIN" always;
#         add_header X-XSS-Protection "1; mode=block" always;
#     }
#     
#     # Point d'entrée PHP principal
#     location ~ ^/public/index\.php$ {
#         if ($request_uri ~ ^/public/index\.php$) {
#             return 301 /;
#         }
#         
#         fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
#         fastcgi_index index.php;
#         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#         include fastcgi_params;
#         fastcgi_param REQUEST_URI $request_uri;
#         fastcgi_param QUERY_STRING $query_string;
#         
#         add_header X-Content-Type-Options "nosniff" always;
#         add_header X-Frame-Options "SAMEORIGIN" always;
#         add_header X-XSS-Protection "1; mode=block" always;
#         access_log off;
#     }
#     
#     location = /index.php {
#         return 301 /;
#     }
#     
#     location ~ /\. {
#         deny all;
#         access_log off;
#         log_not_found off;
#     }
#     
#     autoindex off;
# }








