diff --git a/ecrire/inc_auth.php3 b/ecrire/inc_auth.php3
index cf8eefbe8c70e1c82caac3dc5aba20ff07f3e83a..72bb79c9967b491d0a9772a284dbda5aee1b5fa5 100644
--- a/ecrire/inc_auth.php3
+++ b/ecrire/inc_auth.php3
@@ -101,11 +101,11 @@ function auth_dist() {
 		if ($_GET['bonjour'] == 'oui') $clean_link->delVar('bonjour');
 
 		$url = str_replace('/./', '/',  _DIR_LOGGED_IN. $clean_link->getUrl());
-		redirige_par_entete(generer_url_public('spip_login'),"?url=".urlencode($url));
-		exit;
+		redirige_par_entete(generer_url_public('spip_login'),
+			"?url=".urlencode($url));
+		exit; # pour etre vraiment surs :)
 	}
 
-
 	//
 	// Chercher le login dans la table auteurs
 	//
diff --git a/ecrire/inc_utils.php b/ecrire/inc_utils.php
index 2b21c1fe7fff7ae73270582090d58a7c9b799444..c4870730943935684c3870e152bbe297b4f33b1b 100644
--- a/ecrire/inc_utils.php
+++ b/ecrire/inc_utils.php
@@ -545,6 +545,18 @@ function redirige_par_entete($url, $fin="") {
 #	spip_log("redirige $url$fin");
 	include_ecrire('inc_headers');
 	spip_header("Location: $url$fin");
+
+	echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
+<html><head>
+<title>302 Found</title>
+</head>
+<body>
+<h1>302 Found</h1>
+<a href="'
+.quote_amp("$url$fin")
+.'">Click here</a>.<p>
+</body></html>';
+
 	exit;
 }
 
@@ -640,7 +652,32 @@ function charger_generer_url() {
 		include_local("inc-urls-".$GLOBALS['type_urls']);
 }
 
-// Fonctions de fabriction des URL des scripts de Spip
+
+//
+// Fonctions de fabrication des URL des scripts de Spip
+//
+
+// l'URL de base du site, sans se fier a meta(adresse_site) qui peut etre fausse
+// (sites a plusieurs noms d'hotes, deplacements, erreurs)
+function url_de_base() {
+	global $_SERVER;
+	global $REQUEST_URI;
+
+	static $url;
+
+	if ($url)
+		return $url;
+
+	$http = (substr($_SERVER["SCRIPT_URI"],0,5) == 'https') ? 'https' : 'http';
+	# note : HTTP_HOST contient le :port si necessaire
+	$myself = $http.'://' .$_SERVER['HTTP_HOST'].$REQUEST_URI;
+
+	# supprimer (ecrire/)?xxxxx
+	$url = preg_replace(',/('._DIR_RESTREINT_ABS.')?[^/]*$,', '/', $myself);
+	return $url;
+}
+
+
 // Pour une redirection, la liste des arguments doit etre separee par "&"
 // Pour du code XHTML, ca doit etre &amp;
 // Bravo au W3C qui n'a pas ete capable de nous eviter ca
@@ -650,30 +687,23 @@ function charger_generer_url() {
 // http://httpd.apache.org/docs/2.0/mod/mod_dir.html
 
 function generer_url_ecrire($script, $args="", $no_entities=false, $rel=false) {
-	$site = $rel ? "" : $GLOBALS['meta']["adresse_site"];
-	if ($site)
-	  $site .= ((substr($site,-1) <> '/') ? '/' : '') . _DIR_RESTREINT_ABS;
-	else $site =  _DIR_RESTREINT;
-
-	if (!$site)
-	  $site = './';
-	elseif (substr($site,-1) != '/') {
-		$site .= '/';
-	}
+
+	if (!$rel)
+		$ecrire = url_de_base() . _DIR_RESTREINT_ABS;
+	else
+		$ecrire = _DIR_RESTREINT ? _DIR_RESTREINT : './';
 
 	$ext=(ereg('.php[3]?$', $script) ? '' :_EXTENSION_PHP).($args ? "?" : "");
 	if (!$no_entities) $args = str_replace('&', '&amp;', $args);
 
-	return "$site$script$ext$args";
+	return "$ecrire$script$ext$args";
 }
 
 // scripts publics appeles a partir de l'espace prive ou de l'exterieur (mail)
-
 function generer_url_public($script, $args="", $no_entities=false) {
-	$site = $GLOBALS['meta']["adresse_site"];
-	if ($site)
-	  $site .= ((substr($site,-1) <> '/') ? '/' : '');
-	else $site = _DIR_RACINE;
+	
+	$site = url_de_base();
+
 	if (!$no_entities) $args = str_replace('&', '&amp;', $args);
 	$ext =  (ereg('.php[3]?$', $script) ? '' :_EXTENSION_PHP).($args ? '?' : "");
 	return $site . $script . $ext . $args;
diff --git a/inc-cache.php3 b/inc-cache.php3
index e0079dea80cc4af06a17e9ebcf9074db822bf31c..10bdb047008480bbef19e13266ee597e97b059a6 100644
--- a/inc-cache.php3
+++ b/inc-cache.php3
@@ -18,6 +18,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // la fonction retire_cache()
 //
 function generer_nom_fichier_cache($contexte='', $fond='') {
+	global $_SERVER;
 	global $flag_gz;
 
 	if (!$contexte) {
@@ -41,7 +42,7 @@ function generer_nom_fichier_cache($contexte='', $fond='') {
 		$fichier_cache = 'INDEX-';
 
 	// morceau de md5 selon HOST et $fond
-	$md_cache = md5($fichier_requete . $GLOBALS['HTTP_HOST'] . $fond);
+	$md_cache = md5($fichier_requete . $_SERVER['HTTP_HOST'] . $fond);
 	$fichier_cache .= '.'.substr($md_cache, 1, 8);
 
 	// Sous-repertoires 0...9a..f/