diff --git a/.gitattributes b/.gitattributes
index 89d3d8407c77d19a2cb599070e604803670048c9..a392cdd35399540989c3d38d7c6c39cac779b05d 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -22,6 +22,7 @@ ecrire/action/ical.php -text
 ecrire/action/iconifier.php -text
 ecrire/action/instituer.php -text
 ecrire/action/joindre.php -text
+ecrire/action/logout.php -text
 ecrire/action/purger.php -text
 ecrire/action/redirect.php -text
 ecrire/action/supprimer.php -text
diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php
index 8931162dcdc693addc54afc601d216b98da282a9..2ca4e20f2dbfdd230e21d2c10404af48f32897b1 100644
--- a/ecrire/action/cookie.php
+++ b/ecrire/action/cookie.php
@@ -16,24 +16,17 @@ function action_cookie_dist() {
 	action_spip_cookie_dist();
 }
 
-function auth_http($url, $essai_auth_http) {
-	global $_SERVER;
-	if ($essai_auth_http == 'oui') {
-		if (verifier_php_auth())
-			redirige_par_entete($url);
-		else {
-			ask_php_auth(_T('login_connexion_refusee'),
-			_T('login_login_pass_incorrect'), _T('login_retour_site'),
-			"url=".rawurlencode($url), _T('login_nouvelle_tentative'),
-			(ereg(_DIR_RESTREINT_ABS, $url)));
-			exit;
-		}
-	}
-	// si demande logout auth_http
-	else if ($essai_auth_http == 'logout') {
-		ask_php_auth(_T('login_deconnexion_ok'),
-		_T('login_verifiez_navigateur'), _T('login_retour_public'),
-		"redirect="._DIR_RESTREINT_ABS, _T('login_test_navigateur'), true);
+function auth_http($url) {
+
+	if (verifier_php_auth())
+		redirige_par_entete($url);
+	else {
+		ask_php_auth(_T('login_connexion_refusee'),
+			     _T('login_login_pass_incorrect'),
+			     _T('login_retour_site'),
+			     "url=".rawurlencode($url),
+			     _T('login_nouvelle_tentative'),
+			     (ereg(_DIR_RESTREINT_ABS, $url)));
 		exit;
 	}
 }
@@ -80,31 +73,6 @@ if ($essai_auth_http AND !$ignore_auth_http) {
 	exit;
 }
 
-// cas particulier, logout dans l'espace public
-if ($logout_public) {
-	$logout = $logout_public;
-	if (!$url)  $url = $GLOBALS['meta']['adresse_site'];
- }
-// tentative de logout
-if ($logout) {
-	if ($auteur_session['login'] == $logout) { // init verifier_visiteur
-		spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 15 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
-		if ($spip_session) {
-			$var_f = charger_fonction('session', 'inc');
-			$var_f($auteur_session['id_auteur']);
-		}
-		
-		if ($_SERVER['PHP_AUTH_USER']
-		AND !$ignore_auth_http
-		AND verifier_php_auth()) {
-			auth_http(($url ? $url : _DIR_RESTREINT_ABS), 'logout');
-		}
-	}
-	spip_log("logout: $logout");
-	spip_setcookie('spip_session', '', 0);
-	redirige_par_entete($url ? $url : generer_url_public('login'));
-}
-
 // en cas de login sur bonjour=oui, on tente de poser un cookie
 // puis de passer au login qui diagnostiquera l'echec de cookie
 // le cas echeant.
diff --git a/ecrire/action/logout.php b/ecrire/action/logout.php
new file mode 100644
index 0000000000000000000000000000000000000000..c6d5e2ae2b189e7dfa7e2551da9eba94cacf041e
--- /dev/null
+++ b/ecrire/action/logout.php
@@ -0,0 +1,50 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/cookie');
+
+function action_logout_dist()
+{
+	global $auteur_session, $ignore_auth_httpa;
+	$logout =_request('logout');
+	$url = _request('url');
+	spip_log("logout $logout $url" . $auteur_session['id_auteur']);
+// cas particulier, logout dans l'espace public
+	if ($logout='public' AND !$url)  $url = $GLOBALS['meta']['adresse_site'];
+
+// seul le loge peut se deloger
+	if ($auteur_session['id_auteur']) {
+		spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 15 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
+	// le logout explicite vaut destruction de toutes les sessions
+		if ($_COOKIE['spip_session']) {
+			$var_f = charger_fonction('session', 'inc');
+			$var_f($auteur_session['id_auteur']);
+			spip_setcookie('spip_session', '', 0);
+		}
+		if ($_SERVER['PHP_AUTH_USER'] AND !$ignore_auth_http) {
+			include_spip('inc/actions');
+			if (verifier_php_auth()) {
+			  ask_php_auth(_T('login_deconnexion_ok'),
+				       _T('login_verifiez_navigateur'),
+				       _T('login_retour_public'),
+				       	"redirect=". _DIR_RESTREINT_ABS, 
+				       _T('login_test_navigateur'),
+				       true);
+			  exit;
+			}
+		}
+	}
+	redirige_par_entete($url ? $url : generer_url_public('login'));
+}
+?>
diff --git a/ecrire/balise/url_logout.php b/ecrire/balise/url_logout.php
index 7ec3fbfde4ae201ddd40def6b109b84c4f19d730..39d2163d1225ac4da3f6f1d8b033106989ab6071 100644
--- a/ecrire/balise/url_logout.php
+++ b/ecrire/balise/url_logout.php
@@ -21,11 +21,9 @@ function balise_URL_LOGOUT_stat ($args, $filtres) {
 }
 
 function balise_URL_LOGOUT_dyn($cible) {
-	if (!$login = rawurlencode($GLOBALS['auteur_session']['login']))
-		return '';
 
-	if (!$cible) $cible = self();
+	if (!$GLOBALS['auteur_session']['login']) return '';
 
-	return generer_url_public('spip_cookie',"logout_public=$login&url=" . rawurlencode($cible));
+	return generer_url_action('logout',"logout=public&url=" . rawurlencode($cible ? $cible : self()));
 }
 ?>
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index e0fd0786e180bbba36f67530606a1f5edebc5af0..d7833ab0f64c0466bdd083e734576f3d703c2cf7 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -154,8 +154,12 @@ function inc_auth_dist() {
 	// pour permettre les connexions multiples
 	if (!$_COOKIE['spip_session']) {
 		$var_f = charger_fonction('session', 'inc');
-		if ($session = $var_f($row))
-			spip_setcookie('spip_session', $session, time() + 3600 * 24 * 14);
+		if ($session = $var_f($row)) {
+			preg_match(',^[^/]*//[^/]*(.*)$,',
+				   $GLOBALS['meta']['adresse_site'],
+				   $r);
+			spip_setcookie('spip_session', $session, time() + 3600 * 24 * 14, $r[1]);
+		}
 	}
 
 	// ceci n'arrive qu'a la premiere connexion il me semble
@@ -200,7 +204,5 @@ function auth_arefaire()
 	$url = rawurlencode(str_replace('/./', '/',
 			(_DIR_RESTREINT ? "" : _DIR_RESTREINT_ABS) . str_replace('&amp;', '&', self()))); 
 	return generer_url_public('login', "url=$url" . ($_GET['bonjour'] == 'oui' ? '&var_echec_cookie=true' : ''),true);
-	  }
-
-
+}
 ?>
diff --git a/ecrire/inc/presentation.php b/ecrire/inc/presentation.php
index 3b592fdc43fec516c1923e667ee8164c4da656ff..36192f450b5457e1d32eb34acd59d02c2cd15f2f 100644
--- a/ecrire/inc/presentation.php
+++ b/ecrire/inc/presentation.php
@@ -2289,9 +2289,12 @@ if (true /*$bandeau_colore*/) {
 
 		echo "<td class='bandeau_couleur' style='text-align: $spip_lang_right; width: 28px;' valign='middle'>";
 
-			if ($auth_can_disconnect) {	
-				echo "<a href='" . generer_url_public("spip_cookie","logout=$connect_login") . "' class='icone26' onmouseover=\"changestyle('bandeaudeconnecter','visibility', 'visible');\">" .
-				  http_img_pack("deconnecter-24.gif", "", "") . "</a>";
+		if ($auth_can_disconnect) {
+			echo "<a href='",
+			  generer_url_action("logout","logout=prive"),
+			  "' class='icone26' onmouseover=\"changestyle('bandeaudeconnecter','visibility', 'visible');\">",
+			  http_img_pack("deconnecter-24.gif", "", ""),
+			  "</a>";
 			}
 		echo "</td>";
 	
@@ -2525,7 +2528,7 @@ function bandeau_gadgets($largeur, $simple, $id_rubrique)
 	
 		// Deconnection
 	echo "<div class='bandeau_couleur_sous' id='bandeaudeconnecter' style='$spip_lang_right: 0px;'>";
-	echo "<a href='" . generer_url_public("spip_cookie","logout=$connect_login") . "' class='lien_sous'>"._T('icone_deconnecter')."</a>".aide("deconnect");
+	echo "<a href='" . generer_url_action("logout","logout=prive") . "' class='lien_sous'>"._T('icone_deconnecter')."</a>".aide("deconnect");
 	echo "</div>";
 	
 	$decal = 0;