diff --git a/ecrire/bootstrap/globals_config.php b/ecrire/bootstrap/globals_config.php
new file mode 100644
index 0000000000000000000000000000000000000000..463072f18b7e2eb7faaa30f4464c672510d06599
--- /dev/null
+++ b/ecrire/bootstrap/globals_config.php
@@ -0,0 +1,212 @@
+<?php
+
+/**
+ * Globales (historiques) de config au démarrage de SPIP
+ */
+
+global
+	$auteur_session,
+	$connect_id_rubrique,
+	$connect_statut,
+	$connect_toutes_rubriques,
+	$controler_dates_rss,
+	$cookie_prefix,
+	$debut_date_publication,
+	$derniere_modif_invalide,
+	$dossier_squelettes,
+	$exceptions_des_tables,
+	$filtrer_javascript,
+	$formats_logos,
+	$hash_recherche_strict,
+	$hash_recherche,
+	$help_server,
+	$home_server,
+	$ignore_auth_http,
+	$ignore_remote_user,
+	$ip,
+	$ldap_present,
+	$liste_des_authentifications,
+	$liste_des_etats,
+	$liste_des_statuts,
+	$meta,
+	$mysql_rappel_connexion,
+	$mysql_rappel_nom_base,
+	$nombre_de_logs,
+	$plugins,
+	$puce,
+	$source_vignettes,
+	$spip_matrice,
+	$spip_pipeline,
+	$spip_sql_version,
+	$spip_version_affichee,
+	$spip_version_base,
+	$spip_version_branche,
+	$spip_version_code,
+	$surcharges,
+	$table_date,
+	$table_des_tables,
+	$table_prefix,
+	$table_primary,
+	$table_titre,
+	$tables_auxiliaires,
+	$tables_jointures,
+	$tables_principales,
+	$taille_des_logs,
+	$test_i18n,
+	$tex_server,
+	$traiter_math,
+	$type_urls,
+	$url_glossaire_externe,
+	$visiteur_session,
+	$xhtml,
+	$xml_indent;
+
+# comment on logge, defaut 4 tmp/spip.log de 100k, 0 ou 0 suppriment le log
+$nombre_de_logs = 4;
+$taille_des_logs = 100;
+
+// on peut definir _LOG_FILTRE_GRAVITE dans mes_options.php
+
+// Prefixe des tables dans la base de donnees
+// (a modifier pour avoir plusieurs sites SPIP dans une seule base)
+$table_prefix = 'spip';
+
+// Prefixe des cookies
+// (a modifier pour installer des sites SPIP dans des sous-repertoires)
+$cookie_prefix = 'spip';
+
+// Dossier des squelettes
+// (a modifier si l'on veut passer rapidement d'un jeu de squelettes a un autre)
+$dossier_squelettes = '';
+
+// Pour le javascript, trois modes : parano (-1), prive (0), ok (1)
+// parano le refuse partout, ok l'accepte partout
+// le mode par defaut le signale en rouge dans l'espace prive
+// Si < 1, les fichiers SVG sont traites s'ils emanent d'un redacteur
+$filtrer_javascript = 0;
+// PS: dans les forums, petitions, flux syndiques... c'est *toujours* securise
+
+// Type d'URLs
+// inc/utils.php sélectionne le type 'page' (spip.php?article123) en l'absence
+// d'autre configuration stockée en $GLOBALS['meta']['type_urls]
+// Pour les autres types: voir urls_etendues
+// $type_urls n'a plus de valeur par défaut en 3.1 mais permet de forcer une
+// configuration d'urls dans les fichiers d'options.
+
+#la premiere date dans le menu deroulant de date de publication
+# null: automatiquement (affiche les 8 dernieres annees)
+# 0: affiche un input libre
+# 1997: le menu commence a 1997 jusqu'a annee en cours
+$debut_date_publication = null;
+
+// Pour renforcer la privacy, recopiez-la ligne
+// dans le fichier config/mes_options): SPIP ne pourra alors conserver aucun
+// numero IP, ni temporairement lors des visites (pour gerer les statistiques
+// ou dans spip.log), ni dans les forums (responsabilite)
+# $ip = substr(md5($ip),0,16);
+
+// faut-il faire des connexions Mysql rappelant le nom de la base MySQL ?
+// (utile si vos squelettes appellent d'autres bases MySQL)
+// (A desactiver en cas de soucis de connexion chez certains hebergeurs)
+// Note: un test a l'installation peut aussi avoir desactive
+// $mysql_rappel_nom_base directement dans le fichier inc_connect
+$mysql_rappel_nom_base = true;
+
+// faut-il afficher en rouge les chaines non traduites ?
+$test_i18n = false;
+
+// faut-il ignorer l'authentification par auth http/remote_user ?
+$ignore_auth_http = false;
+$ignore_remote_user = true; # methode obsolete et risquee
+
+// Invalider les caches a chaque modification du contenu ?
+// Si votre site a des problemes de performance face a une charge tres elevee,
+// vous pouvez mettre cette globale a false (dans mes_options).
+$derniere_modif_invalide = true;
+
+//
+// Serveurs externes
+//
+# Serveur de documentation officielle
+$home_server = 'https://www.spip.net';
+# glossaire pour raccourci [?X]. Aussi: [?X#G] et definir glossaire_G
+$url_glossaire_externe = 'https://@lang@.wikipedia.org/wiki/%s';
+
+# TeX
+$tex_server = 'https://math.spip.org/tex.php';
+# MathML (pas pour l'instant: manque un bon convertisseur)
+// $mathml_server = 'http://arno.rezo.net/tex2mathml/latex.php';
+
+// Produire du TeX ou du MathML ?
+$traiter_math = 'tex';
+
+// Appliquer un indenteur XHTML aux espaces public et/ou prive ?
+$xhtml = false;
+$xml_indent = false;
+
+$formats_logos = ['jpg', 'png', 'svg', 'gif', 'webp'];
+
+// Controler les dates des item dans les flux RSS ?
+$controler_dates_rss = true;
+
+//
+// Pipelines & plugins
+//
+# les pipeline standards (traitements derivables aka points d'entree)
+# ils seront compiles par la suite
+# note: un pipeline non reference se compile aussi, mais uniquement
+# lorsqu'il est rencontre
+// https://programmer.spip.net/-Les-pipelines-
+$spip_pipeline = [];
+
+# la matrice standard (fichiers definissant les fonctions a inclure)
+$spip_matrice = [];
+# les plugins a activer
+$plugins = [];  // voir le contenu du repertoire /plugins/
+# les surcharges de include_spip()
+$surcharges = []; // format 'inc_truc' => '/plugins/chose/inc_truc2.php'
+
+// Variables du compilateur de squelettes
+
+$exceptions_des_tables = [];
+$tables_principales = [];
+$table_des_tables = [];
+$tables_auxiliaires = [];
+$table_primary = [];
+$table_date = [];
+$table_titre = [];
+$tables_jointures = [];
+
+// Liste des statuts.
+$liste_des_statuts = [
+	'info_administrateurs' => '0minirezo',
+	'info_redacteurs' => '1comite',
+	'info_visiteurs' => '6forum',
+	'texte_statut_poubelle' => '5poubelle'
+];
+
+$liste_des_etats = [
+	'texte_statut_en_cours_redaction' => 'prepa',
+	'texte_statut_propose_evaluation' => 'prop',
+	'texte_statut_publie' => 'publie',
+	'texte_statut_poubelle' => 'poubelle',
+	'texte_statut_refuse' => 'refuse'
+];
+
+// liste des methodes d'authentifications
+$liste_des_authentifications = [
+	'spip' => 'spip',
+	'ldap' => 'ldap'
+];
+
+// Experimental : pour supprimer systematiquement l'affichage des numeros
+// de classement des titres, recopier la ligne suivante dans mes_options :
+# $table_des_traitements['TITRE'][]= 'typo(supprimer_numero(%s), "TYPO", $connect)';
+
+// ** Securite **
+$visiteur_session = $auteur_session = $connect_statut = $connect_toutes_rubriques = $hash_recherche = $hash_recherche_strict = $ldap_present = '';
+$meta = $connect_id_rubrique = [];
+
+// version de l'interface a la base
+$spip_sql_version = 1;
+
diff --git a/ecrire/bootstrap/initial_config.php b/ecrire/bootstrap/initial_config.php
new file mode 100644
index 0000000000000000000000000000000000000000..2ccbe7c09e24a48b083e209f398bc73a2679f7bf
--- /dev/null
+++ b/ecrire/bootstrap/initial_config.php
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * Constantes de démarrage de SPIP
+ */
+
+/**
+ * Indique que SPIP est chargé
+ *
+ * Cela permet des tests de sécurités pour les fichiers PHP
+ * de SPIP et des plugins qui peuvent vérifier que SPIP est chargé
+ * et donc que les fichiers ne sont pas appelés en dehors de l'usage de SPIP
+ */
+define('_ECRIRE_INC_VERSION', '1');
+
+if (!defined('_DIR_RESTREINT_ABS')) {
+	/** le nom du repertoire ecrire/ */
+	define('_DIR_RESTREINT_ABS', 'ecrire/');
+}
+
+/** Chemin relatif pour aller dans ecrire
+ *  vide si on est dans ecrire, 'ecrire/' sinon */
+define('_DIR_RESTREINT', (is_dir(_DIR_RESTREINT_ABS) ? _DIR_RESTREINT_ABS : ''));
+
+/** Chemin relatif pour aller à la racine */
+define('_DIR_RACINE', _DIR_RESTREINT ? '' : '../');
+
+/** chemin absolu vers la racine */
+define('_ROOT_RACINE', dirname(__DIR__, 2) . '/');
+/** chemin absolu vers le repertoire de travail */
+define('_ROOT_CWD', getcwd() . '/');
+/** chemin absolu vers ecrire */
+define('_ROOT_RESTREINT', _ROOT_CWD . _DIR_RESTREINT);
+
+# Le nom des 4 repertoires modifiables par les scripts lances par httpd
+# Par defaut ces 4 noms seront suffixes par _DIR_RACINE (cf plus bas)
+# mais on peut les mettre ailleurs et changer completement les noms
+if (!defined('_NOM_TEMPORAIRES_INACCESSIBLES')) {
+	/** Nom du repertoire des fichiers Temporaires Inaccessibles par http:// */
+	define('_NOM_TEMPORAIRES_INACCESSIBLES', 'tmp/');
+}
+if (!defined('_NOM_TEMPORAIRES_ACCESSIBLES')) {
+	/** Nom du repertoire des fichiers Temporaires Accessibles par http:// */
+	define('_NOM_TEMPORAIRES_ACCESSIBLES', 'local/');
+}
+if (!defined('_NOM_PERMANENTS_INACCESSIBLES')) {
+	/** Nom du repertoire des fichiers Permanents Inaccessibles par http:// */
+	define('_NOM_PERMANENTS_INACCESSIBLES', 'config/');
+}
+if (!defined('_NOM_PERMANENTS_ACCESSIBLES')) {
+	/** Nom du repertoire des fichiers Permanents Accessibles par http:// */
+	define('_NOM_PERMANENTS_ACCESSIBLES', 'IMG/');
+}
+
+// Icones
+if (!defined('_NOM_IMG_PACK')) {
+	/** Nom du dossier images */
+	define('_NOM_IMG_PACK', 'images/');
+}
+/** le chemin http (relatif) vers les images standard */
+define('_DIR_IMG_PACK', (_DIR_RACINE . 'prive/' . _NOM_IMG_PACK));
+
+/** le chemin php (absolu) vers les images standard (pour hebergement centralise) */
+define('_ROOT_IMG_PACK', dirname(__DIR__, 2) . '/prive/' . _NOM_IMG_PACK);
+
+if (!defined('_JAVASCRIPT')) {
+	/** Nom du repertoire des  bibliotheques JavaScript */
+	// utilisable avec #CHEMIN et find_in_path
+	define('_JAVASCRIPT', 'javascript/');
+}
+
+/** le nom du repertoire des  bibliotheques JavaScript du prive */
+define('_DIR_JAVASCRIPT', (_DIR_RACINE . 'prive/' . _JAVASCRIPT));
+
+/** Le nom du fichier de personnalisation */
+if (!defined('_NOM_CONFIG')) {
+	define('_NOM_CONFIG', 'mes_options');
+}
+
+// Son emplacement absolu si on le trouve
+if (@file_exists($f = _ROOT_RACINE . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')) {
+	/** Emplacement absolu du fichier d'option */
+	define('_FILE_OPTIONS', $f);
+} else {
+	define('_FILE_OPTIONS', '');
+}
+
+if (!defined('MODULES_IDIOMES')) {
+	/**
+	 * Modules par défaut pour la traduction.
+	 *
+	 * Constante utilisée par le compilateur et le décompilateur
+	 * sa valeur etant traitée par inc_traduire_dist
+	 */
+	define('MODULES_IDIOMES', 'public|spip|ecrire');
+}
+
+if (!defined('_IS_CLI')) {
+	define(
+		'_IS_CLI',
+		!isset($_SERVER['HTTP_HOST'])
+		&& !strlen((string) $_SERVER['DOCUMENT_ROOT'])
+		&& !empty($_SERVER['argv'])
+		&& empty($_SERVER['REQUEST_METHOD'])
+	);
+}
+
+// Definir les niveaux de log
+defined('_LOG_HS') || define('_LOG_HS', 0);
+defined('_LOG_ALERTE_ROUGE') || define('_LOG_ALERTE_ROUGE', 1);
+defined('_LOG_CRITIQUE') || define('_LOG_CRITIQUE', 2);
+defined('_LOG_ERREUR') || define('_LOG_ERREUR', 3);
+defined('_LOG_AVERTISSEMENT') || define('_LOG_AVERTISSEMENT', 4);
+defined('_LOG_INFO_IMPORTANTE') || define('_LOG_INFO_IMPORTANTE', 5);
+defined('_LOG_INFO') || define('_LOG_INFO', 6);
+defined('_LOG_DEBUG') || define('_LOG_DEBUG', 7);
diff --git a/ecrire/bootstrap/mitigation.php b/ecrire/bootstrap/mitigation.php
new file mode 100644
index 0000000000000000000000000000000000000000..3007087aca6f93e9b37670ee104a4af2b3e46d3d
--- /dev/null
+++ b/ecrire/bootstrap/mitigation.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * Détecteur de robot d'indexation
+ */
+if (!defined('_IS_BOT')) {
+	define(
+		'_IS_BOT',
+		isset($_SERVER['HTTP_USER_AGENT'])
+		&& preg_match(
+			// mots generiques
+			',bot|slurp|crawler|spider|webvac|yandex|'
+			// MSIE 6.0 est un botnet 99,9% du temps, on traite donc ce USER_AGENT comme un bot
+			. 'MSIE 6\.0|'
+			// UA plus cibles
+			. '80legs|accoona|AltaVista|ASPSeek|Baidu|Charlotte|EC2LinkFinder|eStyle|facebook|flipboard|hootsuite|FunWebProducts|Google|Genieo|INA dlweb|InfegyAtlas|Java VM|LiteFinder|Lycos|MetaURI|Moreover|Rambler|Scooter|ScrubbyBloglines|Yahoo|Yeti'
+			. ',i',
+			(string)$_SERVER['HTTP_USER_AGENT']
+		)
+	);
+}
diff --git a/ecrire/bootstrap/proxy.php b/ecrire/bootstrap/proxy.php
new file mode 100644
index 0000000000000000000000000000000000000000..6203c2254407a0576c90fddb812d1a792921e628
--- /dev/null
+++ b/ecrire/bootstrap/proxy.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * Prendre en compte les proxy
+ *
+ * - entetes HTTP_X_FORWARDED_XX
+ * - ip
+ */
+
+if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
+	if (empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
+		$_SERVER['HTTP_X_FORWARDED_HOST'] = $_SERVER['HTTP_HOST'];
+	}
+	if (empty($_SERVER['HTTP_X_FORWARDED_PORT'])) {
+		$_SERVER['HTTP_X_FORWARDED_PORT'] = 443;
+	}
+}
+
+if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
+	if (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && is_numeric($_SERVER['HTTP_X_FORWARDED_PORT'])) {
+		$_SERVER['SERVER_PORT'] = $_SERVER['HTTP_X_FORWARDED_PORT'];
+		if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
+			$_SERVER['HTTPS'] = 'on';
+			if (isset($_SERVER['REQUEST_SCHEME'])) {
+				$_SERVER['REQUEST_SCHEME'] = 'https';
+			}
+		}
+	}
+	$host = $_SERVER['HTTP_X_FORWARDED_HOST'];
+	if (str_contains((string) $host, ',')) {
+		$h = explode(',', (string) $host);
+		$host = trim(reset($h));
+	}
+	// securite sur le contenu de l'entete
+	$host = strtr($host, "<>?\"\{\}\$'` \r\n", '____________');
+	$_SERVER['HTTP_HOST'] = $host;
+}
+
+//
+// On note le numero IP du client dans la variable $ip
+//
+if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
+	$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
+	if (str_contains((string) $ip, ',')) {
+		$ip = explode(',', (string) $ip);
+		$ip = reset($ip);
+	}
+	// ecraser $_SERVER['REMOTE_ADDR'] si elle est en localhost
+	if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] === '127.0.0.1') {
+		$_SERVER['REMOTE_ADDR'] = $ip;
+	}
+}
+if (isset($_SERVER['REMOTE_ADDR'])) {
+	$ip = $_SERVER['REMOTE_ADDR'];
+}
diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php
index bd8101215613b7e7893d789f7c46655e3d6ee354..a08707d0c506d90ead9f1a4252b88f71977790da 100644
--- a/ecrire/inc_version.php
+++ b/ecrire/inc_version.php
@@ -21,60 +21,7 @@ if (defined('_ECRIRE_INC_VERSION')) {
 	return;
 }
 
-/**
- * Indique que SPIP est chargé
- *
- * Cela permet des tests de sécurités pour les fichiers PHP
- * de SPIP et des plugins qui peuvent vérifier que SPIP est chargé
- * et donc que les fichiers ne sont pas appelés en dehors de l'usage de SPIP
- */
-define('_ECRIRE_INC_VERSION', '1');
-
-/** version PHP minimum exigee (cf. inc/utils) */
-define('_PHP_MIN', '8.1.0');
-define('_PHP_MAX', '8.2.99');
-
-if (!defined('_DIR_RESTREINT_ABS')) {
-	/** le nom du repertoire ecrire/ */
-	define('_DIR_RESTREINT_ABS', 'ecrire/');
-}
-
-/** Chemin relatif pour aller dans ecrire
- *  vide si on est dans ecrire, 'ecrire/' sinon */
-define(
-	'_DIR_RESTREINT',
-	(is_dir(_DIR_RESTREINT_ABS) ? _DIR_RESTREINT_ABS : '')
-);
-
-/** Chemin relatif pour aller à la racine */
-define('_DIR_RACINE', _DIR_RESTREINT ? '' : '../');
-
-/** chemin absolu vers la racine */
-define('_ROOT_RACINE', dirname(__DIR__) . '/');
-/** chemin absolu vers le repertoire de travail */
-define('_ROOT_CWD', getcwd() . '/');
-/** chemin absolu vers ecrire */
-define('_ROOT_RESTREINT', _ROOT_CWD . _DIR_RESTREINT);
-
-# Le nom des 4 repertoires modifiables par les scripts lances par httpd
-# Par defaut ces 4 noms seront suffixes par _DIR_RACINE (cf plus bas)
-# mais on peut les mettre ailleurs et changer completement les noms
-if (!defined('_NOM_TEMPORAIRES_INACCESSIBLES')) {
-	/** Nom du repertoire des fichiers Temporaires Inaccessibles par http:// */
-	define('_NOM_TEMPORAIRES_INACCESSIBLES', 'tmp/');
-}
-if (!defined('_NOM_TEMPORAIRES_ACCESSIBLES')) {
-	/** Nom du repertoire des fichiers Temporaires Accessibles par http:// */
-	define('_NOM_TEMPORAIRES_ACCESSIBLES', 'local/');
-}
-if (!defined('_NOM_PERMANENTS_INACCESSIBLES')) {
-	/** Nom du repertoire des fichiers Permanents Inaccessibles par http:// */
-	define('_NOM_PERMANENTS_INACCESSIBLES', 'config/');
-}
-if (!defined('_NOM_PERMANENTS_ACCESSIBLES')) {
-	/** Nom du repertoire des fichiers Permanents Accessibles par http:// */
-	define('_NOM_PERMANENTS_ACCESSIBLES', 'IMG/');
-}
+require_once __DIR__ . '/bootstrap/initial_config.php';
 
 // inclure l'ecran de securite si il n'a pas été inclus en prepend php
 if (
@@ -85,353 +32,11 @@ if (
 }
 
 // et on peut lancer l'autoloader
-require_once __DIR__ . '/../vendor/autoload.php';
-
-// Icones
-if (!defined('_NOM_IMG_PACK')) {
-	/** Nom du dossier images */
-	define('_NOM_IMG_PACK', 'images/');
-}
-/** le chemin http (relatif) vers les images standard */
-define('_DIR_IMG_PACK', (_DIR_RACINE . 'prive/' . _NOM_IMG_PACK));
-
-/** le chemin php (absolu) vers les images standard (pour hebergement centralise) */
-define('_ROOT_IMG_PACK', dirname(__DIR__) . '/prive/' . _NOM_IMG_PACK);
-
-if (!defined('_JAVASCRIPT')) {
-	/** Nom du repertoire des  bibliotheques JavaScript */
-	define('_JAVASCRIPT', 'javascript/');
-} // utilisable avec #CHEMIN et find_in_path
-/** le nom du repertoire des  bibliotheques JavaScript du prive */
-define('_DIR_JAVASCRIPT', (_DIR_RACINE . 'prive/' . _JAVASCRIPT));
-
-
-/** Le nom du fichier de personnalisation */
-if (!defined('_NOM_CONFIG')) {
-	define('_NOM_CONFIG', 'mes_options');
-}
-
-// Son emplacement absolu si on le trouve
-if (@file_exists($f = _ROOT_RACINE . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')) {
-	/** Emplacement absolu du fichier d'option */
-	define('_FILE_OPTIONS', $f);
-} else {
-	define('_FILE_OPTIONS', '');
-}
-
-if (!defined('MODULES_IDIOMES')) {
-	/**
-	 * Modules par défaut pour la traduction.
-	 *
-	 * Constante utilisée par le compilateur et le décompilateur
-	 * sa valeur etant traitée par inc_traduire_dist
-	 */
-	define('MODULES_IDIOMES', 'public|spip|ecrire');
-}
-
-// *** Fin des define *** //
-
-
-/*
- * Détecteur de robot d'indexation
- */
-if (!defined('_IS_BOT')) {
-	define(
-		'_IS_BOT',
-		isset($_SERVER['HTTP_USER_AGENT'])
-		&& preg_match(
-			// mots generiques
-			',bot|slurp|crawler|spider|webvac|yandex|'
-			// MSIE 6.0 est un botnet 99,9% du temps, on traite donc ce USER_AGENT comme un bot
-			. 'MSIE 6\.0|'
-			// UA plus cibles
-			. '80legs|accoona|AltaVista|ASPSeek|Baidu|Charlotte|EC2LinkFinder|eStyle|facebook|flipboard|hootsuite|FunWebProducts|Google|Genieo|INA dlweb|InfegyAtlas|Java VM|LiteFinder|Lycos|MetaURI|Moreover|Rambler|Scooter|ScrubbyBloglines|Yahoo|Yeti'
-			. ',i',
-			(string)$_SERVER['HTTP_USER_AGENT']
-		)
-	);
-}
-
-if (!defined('_IS_CLI')) {
-	define(
-		'_IS_CLI',
-		!isset($_SERVER['HTTP_HOST'])
-		&& !strlen((string) $_SERVER['DOCUMENT_ROOT'])
-		&& !empty($_SERVER['argv'])
-		&& empty($_SERVER['REQUEST_METHOD'])
-	);
-}
-
-// *** Parametrage par defaut de SPIP ***
-//
-// Les globales qui suivent peuvent etre modifiees
-// dans le fichier de personnalisation indique ci-dessus.
-// Il suffit de copier les lignes ci-dessous, et ajouter le marquage de debut
-// et fin de fichier PHP ("< ?php" et "? >", sans les espaces)
-// Ne pas les rendre indefinies.
-
-global
-	$nombre_de_logs,
-	$taille_des_logs,
-	$table_prefix,
-	$cookie_prefix,
-	$dossier_squelettes,
-	$filtrer_javascript,
-	$type_urls,
-	$debut_date_publication,
-	$ip,
-	$mysql_rappel_connexion,
-	$mysql_rappel_nom_base,
-	$test_i18n,
-	$ignore_auth_http,
-	$ignore_remote_user,
-	$derniere_modif_invalide,
-	$home_server,
-	$help_server,
-	$url_glossaire_externe,
-	$tex_server,
-	$traiter_math,
-	$xhtml,
-	$xml_indent,
-	$source_vignettes,
-	$formats_logos,
-	$controler_dates_rss,
-	$spip_pipeline,
-	$spip_matrice,
-	$plugins,
-	$surcharges,
-	$exceptions_des_tables,
-	$tables_principales,
-	$table_des_tables,
-	$tables_auxiliaires,
-	$table_primary,
-	$table_date,
-	$table_titre,
-	$tables_jointures,
-	$liste_des_statuts,
-	$liste_des_etats,
-	$liste_des_authentifications,
-	$spip_version_branche,
-	$spip_version_code,
-	$spip_version_base,
-	$spip_sql_version,
-	$spip_version_affichee,
-	$visiteur_session,
-	$auteur_session,
-	$connect_statut,
-	$connect_toutes_rubriques,
-	$hash_recherche,
-	$hash_recherche_strict,
-	$ldap_present,
-	$meta,
-	$connect_id_rubrique,
-	$puce;
-
-# comment on logge, defaut 4 tmp/spip.log de 100k, 0 ou 0 suppriment le log
-$nombre_de_logs = 4;
-$taille_des_logs = 100;
-
-// Definir les niveaux de log
-defined('_LOG_HS') || define('_LOG_HS', 0);
-defined('_LOG_ALERTE_ROUGE') || define('_LOG_ALERTE_ROUGE', 1);
-defined('_LOG_CRITIQUE') || define('_LOG_CRITIQUE', 2);
-defined('_LOG_ERREUR') || define('_LOG_ERREUR', 3);
-defined('_LOG_AVERTISSEMENT') || define('_LOG_AVERTISSEMENT', 4);
-defined('_LOG_INFO_IMPORTANTE') || define('_LOG_INFO_IMPORTANTE', 5);
-defined('_LOG_INFO') || define('_LOG_INFO', 6);
-defined('_LOG_DEBUG') || define('_LOG_DEBUG', 7);
-
-// on peut definir _LOG_FILTRE_GRAVITE dans mes_options.php
-
-// Prefixe des tables dans la base de donnees
-// (a modifier pour avoir plusieurs sites SPIP dans une seule base)
-$table_prefix = 'spip';
-
-// Prefixe des cookies
-// (a modifier pour installer des sites SPIP dans des sous-repertoires)
-$cookie_prefix = 'spip';
-
-// Dossier des squelettes
-// (a modifier si l'on veut passer rapidement d'un jeu de squelettes a un autre)
-$dossier_squelettes = '';
-
-// Pour le javascript, trois modes : parano (-1), prive (0), ok (1)
-// parano le refuse partout, ok l'accepte partout
-// le mode par defaut le signale en rouge dans l'espace prive
-// Si < 1, les fichiers SVG sont traites s'ils emanent d'un redacteur
-$filtrer_javascript = 0;
-// PS: dans les forums, petitions, flux syndiques... c'est *toujours* securise
-
-// Type d'URLs
-// inc/utils.php sélectionne le type 'page' (spip.php?article123) en l'absence
-// d'autre configuration stockée en $GLOBALS['meta']['type_urls]
-// Pour les autres types: voir urls_etendues
-// $type_urls n'a plus de valeur par défaut en 3.1 mais permet de forcer une
-// configuration d'urls dans les fichiers d'options.
-
-#la premiere date dans le menu deroulant de date de publication
-# null: automatiquement (affiche les 8 dernieres annees)
-# 0: affiche un input libre
-# 1997: le menu commence a 1997 jusqu'a annee en cours
-$debut_date_publication = null;
-
-
-//
-// Prendre en compte les entetes HTTP_X_FORWARDED_XX
-//
-if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
-	if (empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
-		$_SERVER['HTTP_X_FORWARDED_HOST'] = $_SERVER['HTTP_HOST'];
-	}
-	if (empty($_SERVER['HTTP_X_FORWARDED_PORT'])) {
-		$_SERVER['HTTP_X_FORWARDED_PORT'] = 443;
-	}
-}
-if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
-	if (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && is_numeric($_SERVER['HTTP_X_FORWARDED_PORT'])) {
-		$_SERVER['SERVER_PORT'] = $_SERVER['HTTP_X_FORWARDED_PORT'];
-		if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
-			$_SERVER['HTTPS'] = 'on';
-			if (isset($_SERVER['REQUEST_SCHEME'])) {
-				$_SERVER['REQUEST_SCHEME'] = 'https';
-			}
-		}
-	}
-	$host = $_SERVER['HTTP_X_FORWARDED_HOST'];
-	if (str_contains((string) $host, ',')) {
-		$h = explode(',', (string) $host);
-		$host = trim(reset($h));
-	}
-	// securite sur le contenu de l'entete
-	$host = strtr($host, "<>?\"\{\}\$'` \r\n", '____________');
-	$_SERVER['HTTP_HOST'] = $host;
-}
-//
-// On note le numero IP du client dans la variable $ip
-//
-if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
-	$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
-	if (str_contains((string) $ip, ',')) {
-		$ip = explode(',', (string) $ip);
-		$ip = reset($ip);
-	}
-	// ecraser $_SERVER['REMOTE_ADDR'] si elle est en localhost
-	if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] === '127.0.0.1') {
-		$_SERVER['REMOTE_ADDR'] = $ip;
-	}
-}
-if (isset($_SERVER['REMOTE_ADDR'])) {
-	$ip = $_SERVER['REMOTE_ADDR'];
-}
-
-// Pour renforcer la privacy, decommentez la ligne ci-dessous (ou recopiez-la
-// dans le fichier config/mes_options) : SPIP ne pourra alors conserver aucun
-// numero IP, ni temporairement lors des visites (pour gerer les statistiques
-// ou dans spip.log), ni dans les forums (responsabilite)
-# $ip = substr(md5($ip),0,16);
-
-
-// faut-il faire des connexions Mysql rappelant le nom de la base MySQL ?
-// (utile si vos squelettes appellent d'autres bases MySQL)
-// (A desactiver en cas de soucis de connexion chez certains hebergeurs)
-// Note: un test a l'installation peut aussi avoir desactive
-// $mysql_rappel_nom_base directement dans le fichier inc_connect
-$mysql_rappel_nom_base = true;
-
-// faut-il afficher en rouge les chaines non traduites ?
-$test_i18n = false;
-
-// faut-il ignorer l'authentification par auth http/remote_user ?
-$ignore_auth_http = false;
-$ignore_remote_user = true; # methode obsolete et risquee
-
-// Invalider les caches a chaque modification du contenu ?
-// Si votre site a des problemes de performance face a une charge tres elevee,
-// vous pouvez mettre cette globale a false (dans mes_options).
-$derniere_modif_invalide = true;
-
-//
-// Serveurs externes
-//
-# Serveur de documentation officielle
-$home_server = 'https://www.spip.net';
-# glossaire pour raccourci [?X]. Aussi: [?X#G] et definir glossaire_G
-$url_glossaire_externe = 'https://@lang@.wikipedia.org/wiki/%s';
-
-# TeX
-$tex_server = 'https://math.spip.org/tex.php';
-# MathML (pas pour l'instant: manque un bon convertisseur)
-// $mathml_server = 'http://arno.rezo.net/tex2mathml/latex.php';
-
-// Produire du TeX ou du MathML ?
-$traiter_math = 'tex';
-
-// Appliquer un indenteur XHTML aux espaces public et/ou prive ?
-$xhtml = false;
-$xml_indent = false;
+require_once dirname(__DIR__) . '/vendor/autoload.php';
 
-$formats_logos = ['jpg', 'png', 'svg', 'gif', 'webp'];
-
-// Controler les dates des item dans les flux RSS ?
-$controler_dates_rss = true;
-
-
-//
-// Pipelines & plugins
-//
-# les pipeline standards (traitements derivables aka points d'entree)
-# ils seront compiles par la suite
-# note: un pipeline non reference se compile aussi, mais uniquement
-# lorsqu'il est rencontre
-// https://programmer.spip.net/-Les-pipelines-
-$spip_pipeline = [];
-
-# la matrice standard (fichiers definissant les fonctions a inclure)
-$spip_matrice = [];
-# les plugins a activer
-$plugins = [];  // voir le contenu du repertoire /plugins/
-# les surcharges de include_spip()
-$surcharges = []; // format 'inc_truc' => '/plugins/chose/inc_truc2.php'
-
-// Variables du compilateur de squelettes
-
-$exceptions_des_tables = [];
-$tables_principales = [];
-$table_des_tables = [];
-$tables_auxiliaires = [];
-$table_primary = [];
-$table_date = [];
-$table_titre = [];
-$tables_jointures = [];
-
-// Liste des statuts.
-$liste_des_statuts = [
-	'info_administrateurs' => '0minirezo',
-	'info_redacteurs' => '1comite',
-	'info_visiteurs' => '6forum',
-	'texte_statut_poubelle' => '5poubelle'
-];
-
-$liste_des_etats = [
-	'texte_statut_en_cours_redaction' => 'prepa',
-	'texte_statut_propose_evaluation' => 'prop',
-	'texte_statut_publie' => 'publie',
-	'texte_statut_poubelle' => 'poubelle',
-	'texte_statut_refuse' => 'refuse'
-];
-
-// liste des methodes d'authentifications
-$liste_des_authentifications = [
-	'spip' => 'spip',
-	'ldap' => 'ldap'
-];
-
-// Experimental : pour supprimer systematiquement l'affichage des numeros
-// de classement des titres, recopier la ligne suivante dans mes_options :
-# $table_des_traitements['TITRE'][]= 'typo(supprimer_numero(%s), "TYPO", $connect)';
-
-// Droits d'acces maximum par defaut
-@umask(0);
+require_once __DIR__ . '/bootstrap/globals_config.php';
+require_once __DIR__ . '/bootstrap/proxy.php';
+require_once __DIR__ . '/bootstrap/mitigation.php';
 
 // numero de branche, utilise par les plugins
 // pour specifier les versions de SPIP necessaires
@@ -441,6 +46,10 @@ $spip_version_branche = '5.0.0-dev';
 define('_SPIP_VERSION_ID', 50000);
 define('_SPIP_EXTRA_VERSION', '-dev');
 
+/** version PHP minimum exigee (cf. inc/utils) */
+define('_PHP_MIN', '8.1.0');
+define('_PHP_MAX', '8.2.99');
+
 // cette version dev accepte tous les plugins compatible avec la version ci-dessous
 // a supprimer en phase beta/rc/release
 # define('_DEV_VERSION_SPIP_COMPAT', '4.2.99');
@@ -450,19 +59,13 @@ $spip_version_code = 2023_07_15;
 // version de la base SQL (= Date + numero incremental a 2 chiffres YYYYMMDDXX)
 $spip_version_base = 2022_02_23_03;
 
-// version de l'interface a la base
-$spip_sql_version = 1;
-
 // version de spip en chaine
 // 1.xxyy : xx00 versions stables publiees, xxyy versions de dev
 // (ce qui marche pour yy ne marchera pas forcement sur une version plus ancienne)
 $spip_version_affichee = "$spip_version_branche";
 
-// ** Securite **
-$visiteur_session = $auteur_session = $connect_statut = $connect_toutes_rubriques = $hash_recherche = $hash_recherche_strict = $ldap_present = '';
-$meta = $connect_id_rubrique = [];
-
-// *** Fin des globales *** //
+// Droits d'acces maximum par defaut
+@umask(0);
 
 //
 // Charger les fonctions liees aux serveurs Http et Sql.
@@ -498,7 +101,6 @@ spip_initialisation_core(
 	(_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
 );
 
-
 // chargement des plugins : doit arriver en dernier
 // car dans les plugins on peut inclure inc-version
 // qui ne sera pas execute car _ECRIRE_INC_VERSION est defini
@@ -532,6 +134,7 @@ if (!defined('_OUTILS_DEVELOPPEURS')) {
 if (test_espace_prive()) {
 	include_spip('inc/autoriser');
 }
+
 //
 // Installer Spip si pas installe... sauf si justement on est en train
 //