Aller au contenu

Problème URL rewriting sous SPIP


Sujets conseillés

Bonjour,

J'ai récemment mis en ligne un site sous SPIP en utilisant la réécriture d'url $type_urls = "propres";

Tout marche parfaitement sauf que je me suis rendue compte que les pages 404 n'étaient pas toujours affichées correctement.

Les URL sont réécrites en prenant le titre de l'article, tronquée à un certain nombre de mots. La fin de l'URL n'affiche aucune extension, ni de /

Prenons l'exemple de cette page : http://www.e-dealiz.com/-Accessibilite-numerique-

Elle s'affiche correctement. Si j'ajoute un / à la fin, j'ai une page 404. Jusque là, c'est normal. En revanche, c'est comme si la page 404 était contenue dans le répertoire -Accessibilite-numerique- et du coup, le menu ne fonctionne plus et affiche les pages dans le répertoire inexistant.

2ème problème : -http://www.e-dealiz.com/truc me renvoit une page blanche. Un peu comme si le serveur cherchait un article avec comme titre "truc". La page renvoie un code HTTP 200 au lieu de renvoyer un 404

J'ai regardé sur d'autres sites utilisant la même réécriture d'url et mon 2ème problème n'existe pas chez eux. En revanche, j'ai retrouvé le problème du / en fin d'URL. C'est gênant car sur la page 404, le menu n'est pas exploitable.

Voici le fichier SPIP qui gère l'url rewriting :

<?php

/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright © 2001-2005 *
* 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. *
\***************************************************************************/


// executer une seule fois
if (defined("_INC_URLS2")) return;
define("_INC_URLS2", "1");

/*

- Comment utiliser ce jeu d'URLs ?

Recopiez le fichier "htaccess.txt" du repertoire de base du site SPIP sous
le sous le nom ".htaccess" (attention a ne pas ecraser d'autres reglages
que vous pourriez avoir mis dans ce fichier) ; si votre site est en
"sous-repertoire", vous devrez aussi editer la ligne "RewriteBase" ce fichier.
Les URLs definies seront alors redirigees vers les fichiers de SPIP.

Definissez ensuite dans ecrire/mes_options.php3 :
type_urls = 'propres';
SPIP calculera alors ses liens sous la forme "Mon-titre-d-article".

Variante :
type_urls = 'propres2';
ajoutera '.html' aux adresses generees : "Mon-titre-d-article.html"

*/

if (!defined('_terminaison_urls_propres'))
define ('_terminaison_urls_propres', '');

function _generer_url_propre($type, $id_objet) {
$table = "spip_".table_objet($type);
$col_id = id_table_objet($type);

// Auteurs : on prend le nom
if ($type == 'auteur')
$champ_titre = 'nom AS titre';
else if ($type == 'site' OR $type=='syndic')
$champ_titre = 'nom_site AS titre';
else
$champ_titre = 'titre';

// D'abord, essayer de recuperer l'URL existante si possible
$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
// ou en preview (astuce pour corriger un url-propre) + admin connecte
// Ne pas recalculer l'url-propre,
// sauf si :
// 1) il n'existe pas, ou
// 2) l'objet n'est pas 'publie' et on est admin connecte, ou
// 3) on le demande explicitement (preview) et on est admin connecte
if (defined('_SPIP_REDIRECT') AND
($GLOBALS['preview'] OR ($row['statut'] <> 'publie'))
AND $GLOBALS['auteur_session']['statut'] == '0minirezo')
$modif_url_propre = true;

if ($row['url_propre'] AND !$modif_url_propre)
return $row['url_propre'];

// Sinon, creer l'URL
include_ecrire("inc_filtres.php3");
include_ecrire("inc_charsets.php3");
$url = translitteration(corriger_caracteres(
supprimer_tags(supprimer_numero(extraire_multi($row['titre'])))
));
$url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url);
// S'il reste des caracteres non latins, utiliser l'id a la place
if (preg_match(",[^a-zA-Z0-9 ],", $url)) {
$url = $type.$id_objet;
}
else {
$mots = explode(' ', $url);
$url = '';
foreach ($mots as $mot) {
if (!$mot) continue;
$url2 = $url.'-'.$mot;
if (strlen($url2) > 35) {
break;
}
$url = $url2;
}
$url = substr($url, 1);
//echo "$url<br>";
if (strlen($url) < 2) $url = $type.$id_objet;
}

// Verifier les eventuels doublons et mettre a jour
$lock = "url $type $id_objet";
spip_get_lock($lock, 10);
$query = "SELECT $col_id FROM $table
WHERE url_propre='".addslashes($url)."' AND $col_id != $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);

spip_log("Creation de l'url propre '$url' pour $col_id=$id_objet");

return $url;
}

function generer_url_article($id_article) {
$url = _generer_url_propre('article', $id_article);
if ($url)
return $url . _terminaison_urls_propres;
else
return "article.php3?id_article=$id_article";
}

function generer_url_rubrique($id_rubrique) {
$url = _generer_url_propre('rubrique', $id_rubrique);
if ($url)
return '-'.$url.'-'._terminaison_urls_propres;
else
return "rubrique.php3?id_rubrique=$id_rubrique";
}

function generer_url_breve($id_breve) {
$url = _generer_url_propre('breve', $id_breve);
if ($url)
return '+'.$url.'+'._terminaison_urls_propres;
else
return "breve.php3?id_breve=$id_breve";
}

function generer_url_forum($id_forum, $show_thread=false) {
include_ecrire('inc_forum.php3');
return generer_url_forum_dist($id_forum, $show_thread);
}

function generer_url_mot($id_mot) {
$url = _generer_url_propre('mot', $id_mot);
if ($url)
return '+-'.$url.'-+'._terminaison_urls_propres;
else
return "mot.php3?id_mot=$id_mot";
}

function generer_url_auteur($id_auteur) {
$url = _generer_url_propre('auteur', $id_auteur);
if ($url)
return '_'.$url.'_'._terminaison_urls_propres;
else
return "auteur.php3?id_auteur=$id_auteur";
}

function generer_url_site($id_syndic) {
$url = _generer_url_propre('site', $id_syndic);
if ($url)
return '@'.$url.'@'._terminaison_urls_propres;
else
return "site.php3?id_syndic=$id_syndic";
}

function generer_url_document($id_document) {
if (intval($id_document) <= 0)
return '';
if ((lire_meta("creer_htaccess")) == 'oui')
return "spip_acces_doc.php3?id_document=$id_document";
if ($row = @spip_fetch_array(spip_query("SELECT fichier FROM spip_documents WHERE id_document = $id_document")))
return ($row['fichier']);
return '';
}

function recuperer_parametres_url($fond, $url) {
global $contexte;

// Migration depuis anciennes URLs ?
if ($GLOBALS['_SERVER']['REQUEST_METHOD'] != 'POST' &&
preg_match(',(^|/)((article|breve|rubrique|mot|auteur|site)(\.php3?|[0-9]+\.html)([?&].*)?)$,', $url, $regs)) {
$type = $regs[3];
$id_objet = intval($GLOBALS[$id_table_objet = id_table_objet($type)]);
if ($id_objet) {
$func = "generer_url_$type";
$url_propre = $func($id_objet);
if ($url_propre
AND ($url_propre<>$regs[2])) {
http_status(301);
// recuperer les arguments supplementaires (&debut_xxx=...)
$reste = preg_replace('/^&/','?',
preg_replace("/[?&]$id_table_objet=$id_objet/",'',$regs[5]));
Header("Location: $url_propre$reste");
exit;
}
}
return;
}

$url_propre = $GLOBALS['_SERVER']['REDIRECT_url_propre'];
if (!$url_propre) $url_propre = $GLOBALS['HTTP_ENV_VARS']['url_propre'];
if (!$url_propre) {
$url = substr($url, strrpos($url, '/') + 1);
$url_propre = preg_replace(',[?].*,', '', $url);
}
if (!$url_propre) return;

// Compatilibite avec propres2
$url_propre = preg_replace(',\.html$,i', '', $url_propre);

// Detecter les differents types d'objets demandes
if (preg_match(',^\+-(.*?)-?\+?$,', $url_propre, $regs)) {
$type = 'mot';
$url_propre = $regs[1];
}
else if (preg_match(',^-(.*?)-?$,', $url_propre, $regs)) {
$type = 'rubrique';
$url_propre = $regs[1];
}
else if (preg_match(',^\+(.*?)\+?$,', $url_propre, $regs)) {
$type = 'breve';
$url_propre = $regs[1];
}
else if (preg_match(',^_(.*?)_?$,', $url_propre, $regs)) {
$type = 'auteur';
$url_propre = $regs[1];
}
else if (preg_match(',^@(.*?)@?$,', $url_propre, $regs)) {
$type = 'syndic';
$url_propre = $regs[1];
}
else {
$type = 'article';
preg_match(',^(.*)$,', $url_propre, $regs);
$url_propre = $regs[1];
}

$table = "spip_".table_objet($type);
$col_id = id_table_objet($type);
$query = "SELECT $col_id FROM $table
WHERE url_propre='".addslashes($url_propre)."'";
$result = spip_query($query);
if ($row = spip_fetch_array($result)) {
$contexte[$col_id] = $row[$col_id];
}

return;
}

?>

et mon .htaccess :

##############################################################
# Fichier .htaccess SPIP v1.8 #
# #
# Permet de controler les URLs et la version de php utilisee #
# Compatible avec les URLs 'html', 'propres' et 'propres2' #
# Permet aussi d'effectuer la transition de .PHP 3 vers .PHP #
# #
# Pour utiliser ce fichier renommez-le '.htaccess' dans le #
# repertoire racine du site, en veillant a ne pas ecraser un #
# .htaccess personnalise qui s'y trouverait deja #
# #
# Attention certains hebergeurs desactivent tout ou partie #
# des fonctions du fichier .htaccess ; celui-ci est donc #
# indicatif - en cas de difficulte voir sur les forums SPIP #
##############################################################

RewriteEngine On


################ CONFIGURATION ######################

### Configuration sous-repertoire
# Si votre site est dans un sous-repertoire, preciser ci-dessous
# le nom du sous-repertoire, et supprimer le '#'
# Chez certains hebergeurs il faut indiquer "RewriteBase /"

RewriteBase /


### Version PHP 3
# Si vous utilisez une distribution 'PHP 3' de SPIP, et si votre
# hebergement execute encore les .php[3] avec un moteur PHP 3
# au lieu de PHP 4, vous pouvez decommenter la ligne ci-dessous
# pour faire fonctionner les fichiers sous php4 (sans garantie)

#AddType x-mapp-php4 .php3


# SPIP version 'php' - si vous avez d'anciennes adresses en '.php[3]',
# supprimez le '#' sur les lignes qui suivent pour rediriger les acces
# errones vers le .php correspondant

#RewriteCond %{REQUEST_FILENAME} -f
#RewriteRule ^(.+)\.php[3]$ $1.php [QSA,L]

# Fin version
###


################ REGLAGES PERSONNALISES ######################
# Inscrivez ci-dessous vos reglages supplementaires

# Ne pas afficher le contenu des dossiers

Options -Indexes

# Redirection du .org et .net sur le .com
RewriteCond %{HTTP_HOST} !www.e-dealiz.com$
RewriteRule (.*) [url="http://www.e-dealiz.com/$1"]http://www.e-dealiz.com/$1[/url] [R=301,L]

ErrorDocument 404 /404.php

# Redirection des pages indexées mais 404

RedirectPermanent /test/ [url="http://www.e-dealiz.com"]http://www.e-dealiz.com[/url]


################ GESTIONS DES URLS SPIP #######################

###
# Si le fichier ou repertoire demande existe
# ignorer toutes les regles qui suivent
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule "." - [skip=100]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule "." - [skip=100]
#
###


###
# Compatibilite avec les URLS "html" (pour transition sympa)
# voir fichier inc-urls-html.php3
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]
RewriteRule ^site([0-9]+)\.html$ site.php3?id_syndic=$1 [QSA,L]
# Fin compatibilite
###

###
# URLs "propres" et "propres2"
# pensez a regler $type_urls='propres' ou 'propres2'
# dans ecrire/mes_options.php3
# (fichier associe : inc-urls-propres.php3)

# Les mots-cles
RewriteRule ^\+-[^/\.]+(-\+)?(\.html)?$ mot.php3 [QSA,E=url_propre:$0,L]

# Les breves
RewriteRule ^\+[^/\.]+\+?(\.html)?$ breve.php3 [QSA,E=url_propre:$0,L]

# Les rubriques
RewriteRule ^-[^/\.]+-?(\.html)?$ rubrique.php3 [QSA,E=url_propre:$0,L]

# les auteurs
RewriteRule ^_[^/\.]+_?(\.html)?$ auteur.php3 [QSA,E=url_propre:$0,L]

# Les sites
RewriteRule ^@[^/\.]+@?(\.html)?$ site.php3 [QSA,E=url_propre:$0,L]

# Les articles (en dernier car expression plus "large")
RewriteRule ^[^/\.]+(\.html)?$ article.php3 [QSA,E=url_propre:$0,L]

# Fin URLs "propres" et "propres2"
###

Existe-t-il des solutions à mes problèmes ?

Merci ! :)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...