From ff9dc9b04da77a695fdb75387dfcc5e23ce7b907 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Sun, 22 Jan 2006 20:21:01 +0000
Subject: [PATCH] =?UTF-8?q?g=C3=A9rer=20les=20adresses=20en=20fonction=20d?=
 =?UTF-8?q?u=20HTTP=5FHOST=20et=20pas=20de=20meta['adresse=5Fsite']?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/inc_auth.php3 |  6 ++---
 ecrire/inc_utils.php | 64 ++++++++++++++++++++++++++++++++------------
 inc-cache.php3       |  3 ++-
 3 files changed, 52 insertions(+), 21 deletions(-)

diff --git a/ecrire/inc_auth.php3 b/ecrire/inc_auth.php3
index cf8eefbe8c..72bb79c996 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 2b21c1fe7f..c487073094 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 e0079dea80..10bdb04700 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/
-- 
GitLab