- AccessLogParser : parse COMBINED, agrège hits /post/ et /book/, cache 10 min
- AsnLookup : batch lookup ip-api.com, cache 30j, agrégation et groupes AS
- Onglet Statistiques dans l'admin : top pages, top livres, répartition réseau
- Filtrage par groupe AS (badges) + formulaire de configuration des groupes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- logFiles() utilise glob() au lieu d'un range fixe 1-14
- Support .tar.gz via PharData
- Champ apache_access_log déplacé du tab Site vers un bloc dédié
dans le tab Recherches (action admin_save_searches_config)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajoute apacheAccessLog() dans SiteSettings — priorité au réglage admin,
fallback sur APACHE_ACCESS_LOG dans .env. Champ ajouté dans le formulaire
Site de l'administration.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
file_put_contents() échouait silencieusement (permissions), provoquant
un saved=1 trompeur. Les deux fonctions retournent maintenant bool ;
les callers redirigent vers ?error=write et le template affiche un
message d'erreur explicite.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace la redirection 301 vers le premier résultat par une redirection
302 vers /search?q=... pour laisser l'utilisateur choisir parmi les
résultats.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace le formulaire unique par un wizard 5 étapes (création) et
6 étapes (édition) avec auto-sauvegarde en brouillon, détection de
tags depuis le texte (TagSuggester), aperçu SEO, diff avant validation
et plan Markdown dynamique dans l'éditeur.
Détail des changements :
- ArticleManager : +6 méthodes (updatePartialMeta, saveDraftOverlay,
getDraftOverlay, hasDraftOverlay, discardDraftOverlay, commitDraftOverlay)
- .htaccess : routes /new/{uuid}/{1-5} et /edit/{uuid}/{1-6}
- index.php : cases create et edit réécrits en switch($step),
nouveau case autosave_draft et edit_discard_draft
- assets/js/wizard.js : autosave debounce, auto-resize textarea,
scroll curseur, plan TOC dynamique, toggle pills tags
- templates/wizard/ : nav.php + step1..6.php
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Contexte : sur abonnel.fr, session_start() était appelé sur chaque
requête PHP (y compris bots), créant ~17 000 fichiers de session/jour
dans un répertoire custom non nettoyé par le cron Debian. Les workers
PHP-FPM grossissaient en mémoire et le pool saturait (1 188 erreurs
503 en 30 minutes).
Changements :
public/index.php
- session_start() uniquement si le cookie de session existe déjà ou si
la requête est POST. Les bots (GET sans cookie) ne créent plus de
session.
- CSRF commentaires migré de $_SESSION['comment_csrf'] vers un double-
submit cookie (_csrf_c, SameSite=Strict, HttpOnly). La session n'est
plus requise pour les visiteurs anonymes qui postent un commentaire.
templates/comments_section.php
- Génère le token CSRF et le pose en cookie (_csrf_c) au lieu de
l'écrire en session.
public/.htaccess
- Règle Apache 410 Gone pour toute URL contenant un paramètre ?do=
(anciens paramètres DokuWiki : do=media, do=export_pdf…). Traité par
Apache en 2ms sans toucher PHP-FPM.
public/oidc/{start,callback,me}.php
- Correction du bug introduit par 0b8077e : config.php (qui utilise
BASE_PATH) était chargé avant bootstrap.php (qui définit BASE_PATH).
Fix : define('BASE_PATH', …) ajouté avant le require config.php.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>