RewriteMap pour des url sans ID

  • Auteur de la discussion Anonymous
  • Date de début
A
Anonymous
Guest
Bonjour à tous,

J'essaie depuis deux jours bientôt de mettre en place un url rewriting sur un site sans pour autant réussir à faire quoi que ce soit de propre ... Je m'explique.

Mon site fonctionne actuellement autour d'un index unique, auquel je passe en argument d'adresse une variable page me permettant de localiser le visiteur dans le site. Jusque là, rien de folichons me direz vous, je suis d'accord.

Voici le format de ma variable page :
Code:
page=id_section;id_categorie;id_page;autre_identifiant;encore_un_autre_identifiant;id_langue
Où id_section, id_categorie et id_page correspondent aux trois niveaux de navigation du site, les deux 'autre_identifiant's sont des emplacements utilisés le cas échéants pour préciser des profondeurs supplémentaires - à l'intérieur d'un catalogue, d'une FAQ ou d'une galerie photo par exemple - et enfin id_langue qui me permet d'idientifier la langue utilisée par le visiteur pour parcourir le site.

Parce qu'une série de chiffres barbares n'est pas très parlante, j'aimerais pouvoir réécrire ces url sous la forme :
Code:
monsite.fr/langue/nom-de-la-section/nom-de-la-categorie/nom-de-la-page--nom-de-l-entite.html
Sans AUCUNE id visible donc.

Pour cela, j'ai écris des scripts qui me permettent de générer à partir de ma base de données 5 fichier de map que je souhaiterai utiliser avec le mod_rewrite d'Apache et sa directive RewriteMap.

  • section.map pour les section,
    categorie.map pour les categories,
    page.map pour les pages,
    langue.map pour les langues,
    et entite.map pour les produits, les questions de la FAQ, les actualites, ...


Travaillant sous Windows - au boulot -, je tente donc comme je vous le disais en introduction depuis deux jours de mettre en place des règles d'URL Rewriting sur un serveur WAMP - donc Apache2 -.

Et pour l'instant, le résultat est que mon serveur ne démarre pas :/

Voici le code que j'ai placé dans mon httpd.conf
Code:
# URL Rewriting
Include conf/extra/httpd-rewrite.conf

Voici le contenu de httpd-rewrite.load
Code:
##### Map pour la résolution de l'URL Rewriting #####
		
# Liste les sections		($_page[0])
RewriteMap section txt:"c:/wamp/www/map/section.map"

# Liste les catégories		($_page[1])
RewriteMap categorie txt:"c:/wamp/www/map/categorie.map"

# Liste les pages			($_page[2])
RewriteMap page txt:"c:/wamp/www/map/page.map"

# Liste les langues			($_page[5])
RewriteMap langue txt:"c:/wamp/www/map/langue.map"

# Liste les entités			($_page[3])
#	(maladies, produits, quizz, question de la FAQ, actualite, pages d'archive)
RewriteMap entite txt:"c:/wamp/www/map/entite.map"

Et enfin le contenu du .htaccess se trouvant dans un sous-dossier du DocumentRoot - locamhost/site/ donc -
Code:
##### URL Rewriting #####
Options +FollowSymLinks
RewriteEngine on

RewriteRule ^([a-z]{2})/$ index.php?page=0;0;0;0;0;${langue:$1|1} [QSA,L]
RewriteRule ^([a-z]{2})/([-a-z]*)/$ index.php?page=${section:$2|0};0;0;0;0;${langue:$1|1} [QSA,L]
RewriteRule ^([a-z]{2})/([a-z-]*)/([a-z-]*)/$ index.php?page=${section:$2|0};${categorie:$3|0};0;0;0;${langue:$1|1} [QSA,L]
RewriteRule ^([a-z]{2})/([a-z-]*)/([a-z-]*)/([a-z-]*)\.html$ index.php?page=${section:$2|0};${categorie:$3|0};${page:$4|0};0;0;${langue:$1|1} [QSA,L]
RewriteRule ^([a-z]{2})/([a-z-]*)/([a-z-]*)/--([a-z-]*)\.html$ index.php?page=${section:$2|0};${categorie:$3|0};0;${entite:$4|0;0};${langue:$1|1} [QSA,L]
RewriteRule ^([a-z]{2})/([a-z-]*)/([a-z-]*)/([a-z-]*)--([a-z-]*)\.html$ index.php?page=${section:$2|0};${categorie:$3|0};${page:$4|0};${entite:$5|0;0};${langue:$1|1} [QSA,L]

Quelqu'un saurait-il pourquoi je ne peux même plus lancer mon serveur ?
Le erreur.log est muet comme une tombe, quelque soit le LogLevel que je mette à Apache et j'avoue que je suis un peu perdu, et que je commence à me faire chauve :S

Merci d'avance - rien que pour avoir lu jusqu'ici -
 
A
Anonymous
Guest
La situation a évoluée depuis hier.

En désespoir de faire fonctionner mon site sous Windows et parce que je savait pertinemment que sous Linux j'arrivais au moins à avoir un serveur qui fonctionne à défaut de renvoyer vers les bonnes pages, j'ai migrer sur un serveur de test.


Voici donc le contenu de /etc/apache2/mods-enable/rewrite.load - après un a2enmod rewrite -
Code:
RewriteEngine on

##### Map pour la résolution de l'URL Rewriting #####
      
# Liste les sections      ($_page[0])
RewriteMap section txt:/var/www/vhosts/monsite/section.map

# Liste les catégories      ($_page[1])
RewriteMap categorie txt:/var/www/vhosts/monsite/categorie.map

# Liste les pages         ($_page[2])
RewriteMap page txt:/var/www/vhosts/monsite/page.map

# Liste les langues         ($_page[5])
RewriteMap langue txt:/var/www/vhosts/monsite/langue.map

# Liste les entités         ($_page[3])
#   (maladies, produits, quizz, question de la FAQ, actualite, pages d'archive)
RewriteMap entite txt:/var/www/vhosts/monsite/entite.map

Et le contenu de mon .htaccess à l'heure actuelle.
Code:
##### URL Rewriting #####
Options +FollowSymLinks
RewriteEngine on

RewriteRule ^([a-z]{2})/$ index.php?page=0;0;0;0;0;${langue:$1} [QSA,L]
RewriteRule ^([a-z]{2})/([-a-z]*)/$ index.php?page=${section:$2};0;0;0;0;${langue:$1} [QSA,L]
RewriteRule ^([a-z]{2})/([a-z-]*)/([a-z-]*)/$ index.php?page=${section:$2};${categorie:$3};0;0;0;${langue:$1} [QSA,L]
RewriteRule ^([a-z]{2})/([a-z-]*)/([a-z-]*)/([a-z-]*)\.html$ index.php?page=${section:$2};${categorie:$3};${page:$4};0;0;${langue:$1} [QSA,L]
RewriteRule ^([a-z]{2})/([a-z-]*)/([a-z-]*)/--([a-z-]*)\.html$ index.php?page=${section:$2};${categorie:$3};0;${entite:$4};${langue:$1} [QSA,L]
RewriteRule ^([a-z]{2})/([a-z-]*)/([a-z-]*)/([a-z-]*)--([a-z-]*)\.html$ index.php?page=${section:$2};${categorie:$3};${page:$4};${entite:$5};${langue:$1} [QSA,L]

Il semblerait que quoi qu'il arrive, il ne retrouve jamais ses petits dans les .map. Pourtant ils sont bien rempli avec ce qu'il faut depuis la base de données...


Quelqu'un aurait-il une idée ?

Merci d'avance,
 
A
Anonymous
Guest
Bon, étrangmeent, sur un serveur digne de ce nom, on travaille beaucoup mieux ... - de base parce qu'il démarre ^^ -

Il me reste simplement un dernier problème à résoudre : la redirection des adresse de l'ancien format vers le nouveau.

J'ai créé une map supplémentaire qui recense toutes les correspondance en adresses du site sous cette forme :

Code:
index.php?page=17;58;0;4;0;1 http://www.monsite.com/fr/informations/actualites/_-vous-visitez-l-europe-du-nord.html

Pour le moment, j'ai la règle suivante :

Code:
RewriteRule ^(index\.php\?page=([0-9]*;){5}[0-9]*)$ ${redirect:$1} [R=301,L]

Elle est placé tout en haut de la liste des RewriteRules, et correspond sauf erreur au bon motif.

Y aurait-il une erreur que je n'aurais pas vu ? ... Je tombe bien sur la bonne page, mais avec l'adresse à l'ancien format toujours dans la barre.

Merci d'avance.
 
A
Anonymous
Guest
Visiblement on ne peut pas placer des conditions sur les variables passées en GET dans une RewriteRule - ou alors j'ai pas trouver comment ... -, donc je suis reparti sur ma première solution de générer le .htaccess en même temps que la map du site, pour y écrire toutes les redirections permanentes nécessaires.

Et ça n'a pas l'air de fonctionner mieux.
Ici aussi les variables ne passent pas ? - ce serait stupide pour le coup, il doit bien y avoir une option ... -


[Hey dites]

Finalement, ni Redirect ni RewriteRule n'ont l'air de prendre en compte les variables passées dans l'adresse pour effectuer leur traitement.
Je me suis donc reporté sur une solution par programmation : Lors de l'arrivée sur une page du site, je détecte en comparant $_SERVER['REQUEST_URI'] et $_SERVER['QUERY_STRING'] si l'adresse est au bon format ou non, auquel cas je redirige le visiteur vers la page qui va bien à l'aide de la fonction header - en oubliant pas de préciser le code 301 de la redirection permanente -



Merci pour votre aide à tous, ce fut un plaisir de soliloquer en votre compagnie. J'espère que ce sujet pourra, à défaut de l'avoir fait pour moi, aider les prochains qui tenteront de mettre en place ce genre de remapage.
 
Haut