rewriting sous forme /categorie_cafetiere.html

Nouveau WRInaute
Bonjour ,


j'aimerais savoir si il est possibe de passer d'une regle de type :

Code:
RewriteRule ^categorie_([1-9][0-9]*)\.html$  index.php?cPath=$1 [L]

en quelque chose du genre /categorie_cafetiere.html sachant bein sur qu'il existe dasn ma bdd une correspondance entre le numero cpath et le titre de la categorie .....
pour cela j'utilise

Code:
RewriteMap categories  txt:categories.txt
RewriteRule ^(.*)$ index.php?cPath=${categories:$1|0}

avec un fichier categories.txt situé dasn le dossier conf et qui contient :

aspirateur 1
televiseur 2
hifi 3

mais cela ne fonctionne aps et je tombe sur une 404 si je tape l url :

Code:
http://localhost/test/categorie3


une idee ?
 
WRInaute discret
Je sais pas comment faire exactement ce que tu veut mais sinon tu peut essayer qqchose dans ce genre :

Code:
RewriteRule ^categorie([0-9])_([a-z]+)\.html$ index.php?cPath=$1 [L]

Ca te ferait des liens du style categorie9_cafetiere.html

Tout en sachant que le mot après _ ne sert a rien mais tu peut facilement le récupérer dans ta base de donnée en fonction de l'id de la catégorie :)
 
WRInaute occasionnel
Si on parle bien d'un fichier de conf, probablement un problème de chemins par rapport au DocumentRoot

Code:
RewriteRule ^/test/(.*)$ /index.php?cPath=${categories:$1|0}
en supposant qu'index.php se trouve à la racine.
 
Nouveau WRInaute
je pense aussi que c'est un proeleme de chemin ..... j'ai aussi ctrl+c le fichier categorie dans mon repertoire test

Code:
RewriteMap categories  txt:/test/categories.txt
RewriteRule ^/test/(.*)$ /test/index.php?cPath=${categories:$1|tutu}

mais j obtient tjs une 404 ......
voici l'article original dou je tire mon code :*

For Advanced Users

I mentioned user-friendliness in the introduction, and haven't dealt with it. First, let's imagine we're having a huge download site that has the downloadable software separated into categories, each with a unique id (which is used in the SQL SELECTs). We use links like open.php?categoryid=23487678 to display the contents of a category.

To ensure that our URLs were easily memorized (eg. http://www.downloadsite.com/Nettools/Messengers) we could use:

RewriteRule ^/NetTools$ /test.php?target=3
RewriteRule ^/NetTools/Messengers$ /test.php?target=34

assuming the ID is 3 for the NetTools category and 34 for Messengers subcategory.

But our site is huge, as I've mentioned - who wants to hunt down all the IDs from the database, and then edit the config file by hand? No-one! Instead, we can use the mapping feature of mod_rewrite. Map allows us to provide a replacement-table - stored in a single text file -- within a hash file (for fast lookups), or even served through an external program!

For better performance I'd generate a single text file using PHP, which contains the following:

NetTools 3
NetTools/Messengers 34
.
.
.
and so on.

The httpd.conf file would contain:

RewriteMap categories txt:/path/to/file/categoryids.txt
RewriteRule ^(.*)$ open.php?categoryid=${categories:$1|0}

These lines tell mod_rewrite to read the categoryids.txt file upon Apache startup, and provide the ID for the URL for open.php. The |0 means that categoryid will be 0 if there's no matching key in the textfile.

You can also choose to serve the IDs on-the-fly via a script or other executable code. The program is started by Apache on server startup, and runs until shutdown. The program must have buffered I/O disabled, read from the stdin, and write results to stdout -- it's that simple!

With RewriteMap you can do a lot more, including:

* load balancing through servers (using rnd:),
* creation of a Webcluster that has an homogenous URL layout,
* redirection to mirror sites without modifying your Web application,
* denial of user access based on a hostlist,

and so on.
 
WRInaute occasionnel
Indique le chemin complet pour le fichier de RewriteMap, par exemple /home/www/test/categories.txt ou c:/apache/www/test/categories.txt sur Windows, ca simplifiera le problème. Là, en l'état, ca pointe vers un fichier /test/categories.txt à la racine du système. Les logs d'Apache devraient te donner les erreurs éventuelles sur le repérage du fichier, après redémarrage bien entendu.

Ensuite, pour éviter les 404, quelque chose comme ca :
Code:
RewriteCond ${categories:$1|NOT-FOUND} !=NOT-FOUND
RewriteRule ^/test/(.*)$ /test/index.php?cPath=${categories:$1} [L]

RewriteRule ^/test/(.*)$ /test/index.php [L]
 
WRInaute discret
Merci pour l'article, je connaissais pas cette méthode :)

Sinon pour le chemin à indiquer, peut-être qu'il faut donner le chemin depuis le /home/site/www etc. ?
pour moi c'est par exemple le cas pour les fichiers de password (AuthUserFile)
 
Nouveau WRInaute
rhaaaaaaaaaa ca me rend folle , tjs une belle 404 avec

Code:
RewriteMap categories  txt:/home/www/test/categories.txt
RewriteRule ^/test/(.*)$ /test/index.php?cPath=${categories:$1|tutu}

par contre la structure du fichier categorie.txt m intrigue ... pas besoin de delimiteur ???
 
WRInaute occasionnel
Apache ne dit rien quand tu le redémarres? Rien dans les logs?

Pour voir ce qu'il se passe, tu peux activer le log du rewriting
Code:
RewriteEngine On
RewriteLogLevel 9
RewriteLog      /home/www/test/rewrite.log

Les maps par fichiers texte sont sous forme de paires clé valeur, une par ligne.

Pour info, la doc du RewriteMap
 
Nouveau WRInaute
un simple

[Fri Jul 23 15:46:57 2004] [error] [client 127.0.0.1] File does not exist: c:/program files/easyphp1-7/www/test/hifi

peu parlant

vous le dites si vous en avez marre :wink:
 
WRInaute occasionnel
Ah. Le problème vient assez certainement du fait que les chemins utilisés jusque là sont des chemins Unix alors qu'apparemment tu es sur Windows.

Reprenons. Normalement, avec quelque chose comme ca dans ton fichier de conf, ca devrait fonctionner, plus ou moins :
Code:
RewriteEngine On
RewriteMap categories  txt:c:/program files/easyphp1-7/www/test/categories.txt 
RewriteRule ^/test/(.*)$ /test/index.php?cPath=${categories:$1|tutu}

Redémarrage d'Apache, test, joie dans les coeurs?
 
Nouveau WRInaute
un week end et un litre de café ne mon pas sortie de cet inextricable probleme :roll:

quelqun a t il deja utilisé avec succes les RewriteMap :?:
 
Nouveau WRInaute
8)

bon j avance ( grâce a vous tous merci ) .... mon rewritemap marche :

LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteMap categories txt:c:/categories.txt

RewriteRule /(.*) http://localhost/tutu.php?cat=${categories:$1|tutu} [R]

par contre mon expression reguliére est bancale car elle fait boucler mon serveur ....

help !

:wink:
 
WRInaute occasionnel
Normal, dès que tu trouves quelque chose, tu rediriges, ce qui revient au serveur, qui trouve quelque chose, qui redirige...

Code:
RewriteCond ${categories:$1|NOT-FOUND} !=NOT-FOUND 
RewriteRule ^/(.*)$ /tutu.php?cat=${categories:$1} [L]
 
Nouveau WRInaute
Etant débutant dans l'usage de l'url rewriting, je me pose la question suivante : est-ce bien utile d'utiliser la rewriting map pour ce type de besoin ?

Je veux dire par là que puisque on met le titre de la catégorie dans l'url, pourquoi ne pas faire une requete sql du type SELECT * FROM latable WHERE titreCategorie = titre dans l'url

La requete sera plus longue que si on utilisait l'ID, mais d'un autre côté on gagne du temps en ne parcourant pas la rewriting map qui devient alors inutile.
Qu'en pensez-vous ?
 
Discussions similaires
Haut