diff --git a/htaccess-propres.txt b/htaccess-propres.txt index d8951f82f351ee06e06f76409b80ed8cb501d4c2..6478b40bdc41230ade8340840260dbd2cd15286e 100644 --- a/htaccess-propres.txt +++ b/htaccess-propres.txt @@ -12,6 +12,16 @@ RewriteEngine On ### si votre site est en sous-domaine, preciser ci-dessous # RewriteBase /sous/domaine/ +### +# Compatibilite avec les URLS "html" (pour transition sympa) +RewriteRule ^rubrique([0-9]+)\.html$ rubrique.php3?id_rubrique=$1 [QSA,L] +RewriteRule ^article([0-9]+)\.html$ article.php3?id_article=$1 [QSA,L] +RewriteRule ^breve([0-9]+)\.html$ breve.php3?id_breve=$1 [QSA,L] +RewriteRule ^mot([0-9]+)\.html$ mot.php3?id_mot=$1 [QSA,L] +RewriteRule ^auteur([0-9]+)\.html$ auteur.php3?id_auteur=$1 [QSA,L] +# Fin compatibilite +### + # Rediriger les mots et breves sans le "+" final RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d @@ -37,16 +47,8 @@ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^_[^/\.]+(\.html)?$ auteur.php3 [QSA,E=url_propre:$0,L] -# Les articles +# Les articles (en dernier car expression plus "large") RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^[^/\.]+(\.html)?$ article.php3 [QSA,E=url_propre:$0,L] - -### -# Compatibilite avec les URLS "html" (pour transition sympa) -RewriteRule ^rubrique([0-9]+)\.html$ rubrique.php3?id_rubrique=$1 [QSA,L] -RewriteRule ^article([0-9]+)\.html$ article.php3?id_article=$1 [QSA,L] -RewriteRule ^breve([0-9]+)\.html$ breve.php3?id_breve=$1 [QSA,L] -RewriteRule ^mot([0-9]+)\.html$ mot.php3?id_mot=$1 [QSA,L] -RewriteRule ^auteur([0-9]+)\.html$ auteur.php3?id_auteur=$1 [QSA,L] diff --git a/inc-urls-html.php3 b/inc-urls-html.php3 index 4a0eb8e45add937b67b5067a12f1fe5dadf8fcce..3dad37274609c396874750f6480211d742706716 100644 --- a/inc-urls-html.php3 +++ b/inc-urls-html.php3 @@ -66,6 +66,29 @@ function generer_url_document($id_document) { function recuperer_parametres_url($fond, $url) { global $contexte; + + + /* + * Le bloc qui suit sert a faciliter les transitions depuis + * le mode 'urls-propres' vers les modes 'urls-standard' et 'url-html' + * Il est inutile de le recopier si vous personnalisez vos URLs + * et votre .htaccess + */ + // Si on est revenu en mode html, mais c'est une ancienne url_propre + // on ne redirige pas, on assume le nouveau contexte (si possible) + if ($url_propre = $GLOBALS['_SERVER']['REDIRECT_url_propre'] + OR $url_propre = $GLOBALS['HTTP_ENV_VARS']['url_propre'] + AND preg_match(',^(article|breve|rubrique|mot|auteur)$,', $fond)) { + $url_propre = preg_replace('/^[_+-]{0,2}(.*?)[_+-]{0,2}(\.html)?$/', + '$1', $url_propre); + if ($r = spip_query("SELECT id_$fond AS id FROM spip_".$fond."s + WHERE url_propre = '".addslashes($url_propre)."'") + AND $t = spip_fetch_array($r)) + $contexte["id_$fond"] = $t['id']; + } + /* Fin du bloc compatibilite url-propres */ + + return; } diff --git a/inc-urls-propres.php3 b/inc-urls-propres.php3 index c0cceeea6b8cc1c1e904dcf2742c1161828698b3..82314784730b647f3af14c49661f40f55d33a664 100644 --- a/inc-urls-propres.php3 +++ b/inc-urls-propres.php3 @@ -39,8 +39,15 @@ function _generer_url_propre($type, $id_objet) { $table = "spip_".$type."s"; $col_id = "id_".$type; + // Auteurs : on prend le nom + if ($type == 'auteur') + $champ_titre = 'nom AS titre'; + else + $champ_titre = 'titre'; + // D'abord, essayer de recuperer l'URL existante si possible - $result = spip_query("SELECT * FROM $table WHERE $col_id=$id_objet"); + $result = spip_query("SELECT url_propre, $champ_titre + FROM $table WHERE $col_id=$id_objet"); if (!($row = spip_fetch_array($result))) return ""; # objet inexistant // Si l'on n'est pas dans spip_redirect.php3 sur un objet non publie @@ -93,6 +100,14 @@ function _generer_url_propre($type, $id_objet) { if (spip_num_rows(spip_query($query)) > 0) { $url = $url.','.$id_objet; } + + // Eviter de tamponner les URLs a l'ancienne (cas d'un article + // intitule "auteur2") + if ($type == 'article' + AND preg_match(',^(article|breve|rubrique|mot|auteur)[0-9]+$,', $url)) + $url = $url.','.$id_objet; + + // Mettre a jour dans la base $query = "UPDATE $table SET url_propre='".addslashes($url)."' WHERE $col_id=$id_objet"; spip_query($query); spip_release_lock($lock); @@ -162,7 +177,7 @@ function recuperer_parametres_url($fond, $url) { // Migration depuis anciennes URLs ? if ($GLOBALS['_SERVER']['REQUEST_METHOD'] != 'POST' && - preg_match(',(^|/)((article|breve|rubrique|mot)\.php3?([\?&].*)?)$,', $url, $regs)) { +preg_match(',(^|/)((article|breve|rubrique|mot|auteur)(\.php3?|[0-9]+\.html)([?&].*)?)$,', $url, $regs)) { $type = $regs[3]; $id_objet = intval($GLOBALS['id_'.$type]); if ($id_objet) { diff --git a/inc-urls-standard.php3 b/inc-urls-standard.php3 index 1540d032a177423edf5bbb86546702e4e97ff1fa..ca9348cdf8a42378b04f64feb19b7656b7f13c36 100644 --- a/inc-urls-standard.php3 +++ b/inc-urls-standard.php3 @@ -47,6 +47,28 @@ function generer_url_document($id_document) { function recuperer_parametres_url($fond, $url) { global $contexte; + + + /* + * Le bloc qui suit sert a faciliter les transitions depuis + * le mode 'urls-propres' vers les modes 'urls-standard' et 'url-html' + * Il est inutile de le recopier si vous personnalisez vos URLs + * et votre .htaccess + */ + // Si on est revenu en mode html, mais c'est une ancienne url_propre + // on ne redirige pas, on assume le nouveau contexte (si possible) + if ($url_propre = $GLOBALS['_SERVER']['REDIRECT_url_propre'] + OR $url_propre = $GLOBALS['HTTP_ENV_VARS']['url_propre'] + AND preg_match(',^(article|breve|rubrique|mot|auteur)$,', $fond)) { + $url_propre = preg_replace('/^[_+-]{0,2}(.*?)[_+-]{0,2}(\.html)?$/', + '$1', $url_propre); + if ($r = spip_query("SELECT id_$fond AS id FROM spip_".$fond."s + WHERE url_propre = '".addslashes($url_propre)."'") + AND $t = spip_fetch_array($r)) + $contexte["id_$fond"] = $t['id']; + } + /* Fin du bloc compatibilite url-propres */ + return; }