Reécriture pour simuler un répertoire

WRInaute occasionnel
Bonjour,
je suis débutant en urlrewritting.
j'utilise cette méthode pour mes sites (enfin des choses pas trop pousser) mais la je bloque sur ce cas.

J'ai dans ma bdd 5 6 catégorie différentes que je voudrais assimiler à des dossiers

exemple :

www.monsite.com/categorie1
www.monsite.com/categorie2
www.monsite.com/categorie3
www.monsite.com/categorie4
...

j'avais tenté ce code pour ce cas mais il ne semble pas fonctionner :

RewriteEngine on
RewriteRule ^(.+)$ album-photos.php?nom_cat=$1 [L,QSA]

____________________

Etape suivante, quand je suis sur la page en question, je propose différents albums concernant cette catégorie.
Je voudrais prendre le nom des albums pour faire les urls suivantes :

www.monsite.com/categorie1/nomalbum1.htm
www.monsite.com/categorie1/nomalbum2.htm
www.monsite.com/categorie1/nomalbum3.htm
....

J'avais tenté ce code mais rien...
RewriteEngine on
RewriteRule ^(.+)-(.+)+)\.htm$ selection-album.php?nom_alb=$2 [L,QSA]

Une autre petite question, est ce que j'ai besoin de passer le num_cat et num_alb dans l'url pour récupérer les infos via ma requête ?

Merci d'avance
 
WRInaute impliqué
La première règle semble bonne.

La seconde ne devrait pas plutot être :
Code:
RewriteRule ^(.+)/(.+)\.htm$ selection-album.php?nom_alb=$2 [L,QSA]
 
WRInaute occasionnel
Pour la deuxième je pars plus sur un truc du genre :

RewriteRule ^(.+)/(.+)-([0-9]+)\.php$ affichage-album.php?nom_cat=$1&nom_alb=$2&num_alb=$3 [L,QSA]

mais marche pas non plus ^^
 
WRInaute accro
pour le virtuel tu dois mettre dans ton <head> :

<link rel="canonical" href="http://www.tonsite.com/">

la réécriture:

-www.monsite.com/categorie1/nomalbum1.htm

Code:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/nomalbum([0-9]+)\.htm$  album-photos.php?id=$2 [L]
 
Nouveau WRInaute
Bonsoir à tous,

Après avoir longuement cherché sur le net, je trouve enfin ce post qui correspond à peu près à ce que je cherche à faire.

J'aimerai en fait, simuler une arborescence dans la gestion de mon URLRewrinting. La prise en compte de l'arborescence fonctionne, mais lorsque j'accède à une page qui simule un niveau de dossier, les fichiers en include ne sont plus pris en compte (puisqu'il ne se trouve évidement pas dans le faux sous-repertoire), les liens relatifs comportent deux fois le dossier en question, ... .

Comment faire pour que la fausse arbo ne soit pas prise en compte par les scripts & co ? Est-ce que quelqu'un à déjà rencontré ce cas de figure ?

Voici mon URLRwritring actuel :

Code:
# Interdit le listage d'un répertoire
IndexIgnore *

# Le serveur doit suivre les liens symboliques :
Options +FollowSymlinks

# Activation du module de réécriture d'URL :
RewriteEngine on

#Règles de réécriture
RewriteRule ^accueil.html$   ?p=5 [L]
RewriteRule ^contact.html$   ?p=8 [L]
RewriteRule ^produits.html$   ?p=11 [L]
RewriteRule ^produits/page1.html$   ?sp=4 [L]
RewriteRule ^produits/page2.html$   ?sp=5 [L]
RewriteRule ^produits/page3.html$   ?sp=6 [L]

Merci à tous,
Thomas.

EDIT :
Après avoir chercher davantage, j'ai lu quelquepart que sur un mutualisé OVH, il fallait forcément préciser les URL destinations en absolue, mon .htaccess est donc maintenant :

Code:
# Interdit le listage d'un répertoire
IndexIgnore *

# Le serveur doit suivre les liens symboliques :
Options +FollowSymlinks

# Activation du module de réécriture d'URL :
RewriteEngine on

#Règles de réécriture
RewriteRule ^accueil\.html$   http://www.monsite.fr/pilote/index.php?p=5 [L]
RewriteRule ^contact\.html$   http://www.monsite.fr/pilote/index.php?p=8 [L]
RewriteRule ^produits\.html$   http://www.monsite.fr/pilote/index.php?p=11 [L]
RewriteRule ^produits/page1\.html$   http://www.monsite.fr/pilote/index.php?sp=4 [L]
RewriteRule ^produits/page2\.html$   http://www.monsite.fr/pilote/index.php?sp=5 [L]
RewriteRule ^produits/page3\.html$   http://www.monsite.fr/pilote/index.php?sp=6 [L]

Les liens sont rétablis, mais soucis : l'url affichée dans le navigateur correspond à celle censée être masquée, c'est à dire :
http://www.monsite.fr/pilote/index.php?p=5

Une idée ?

Merci :eek:
 
Nouveau WRInaute
KOogar a dit:
pour le virtuel tu dois mettre dans ton <head> :

<link rel="canonical" href="http://www.tonsite.com/">

la réécriture:

-www.monsite.com/categorie1/nomalbum1.htm

Code:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/nomalbum([0-9]+)\.htm$  album-photos.php?id=$2 [L]

KOogar, peux-tu expliquer ton code en détail, stp ?

Merci :D
 
WRInaute accro
:D
Partir du principe que les regles ne changent pas de l'ordinaire, il faut écrire ses regles sans changer ses habitudes. Seul 2 points sont a voir pour que la simulation fonctionne normalement. Le premier est d'ajouter une condition supplémentaire dans le fichier .htaccess et la seconde est d'ajouter un tag supplémentaire dans le <head> des documents html, voyons le détail:

1° Pour qu'une règle de réécriture soit appliquée si la requête ne correspond pas a un répertoire existant (ce qui est notre cas) il faut ajouter avant la règle de réécriture la condition suivante :
RewriteCond %{REQUEST_FILENAME} !-d

2° Il faut aussi ajouter dans le <head> la ligne suivante en mettant l'url du site
<link rel="canonical" href="http://www.tonsite.com/">

en mettant la racine en url canonicale, le slash "/" devient la racine. il faut maintenant appeler les fichiers sans oublier d'ajouter le "/" slash : <img scr="/images/images.jpg">
 
Nouveau WRInaute
KOogar a dit:
:D
Partir du principe que les regles ne changent pas de l'ordinaire, il faut écrire ses regles sans changer ses habitudes. Seul 2 points sont a voir pour que la simulation fonctionne normalement. Le premier est d'ajouter une condition supplémentaire dans le fichier .htaccess et la seconde est d'ajouter un tag supplémentaire dans le <head> des documents html, voyons le détail:

1° Pour qu'une règle de réécriture soit appliquée si la requête ne correspond pas a un répertoire existant (ce qui est notre cas) il faut ajouter avant la règle de réécriture la condition suivante :
RewriteCond %{REQUEST_FILENAME} !-d

2° Il faut aussi ajouter dans le <head> la ligne suivante en mettant l'url du site
<link rel="canonical" href="http://www.tonsite.com/">

en mettant la racine en url canonicale, le slash "/" devient la racine. il faut maintenant appeler les fichiers sans oublier d'ajouter le "/" slash : <img scr="/images/images.jpg">

En appliquant cette méthode, j'obtiens un comportement vraiment bizarre.

J'ai ajouté les conditions pour le rewrite, ajouter la link canonical (incluant un sous-dossier, dans mon cas : "http://www.monsites.fr/dossier/").

Si je mets un / devant mes URLs relative, il m'affiche le contenu d'une arborescence en dessous. Si je ne mets pas le / il m'affiche le bon contenu mais sans les liens vers les CCS et les fichiers en include/require sont introuvable. Il prend toujours le faux dossier comme un vrai dossier.

Une idée ? :(

Merci.
Thomas.
 
WRInaute accro
dans ce cas il faut que le dossier existe physiquement
<link rel="canonical" href="http://www.tonsite.com/dossier/">

si il s'agit d'un dossier virtuel il ne faut rien mettre
<link rel="canonical" href="http://www.tonsite.com/">

et pour le style
<link href="/style.css" rel="stylesheet" type="text/css" />
 
Nouveau WRInaute
KOogar a dit:
dans ce cas il faut que le dossier existe physiquement
<link rel="canonical" href="http://www.tonsite.com/dossier/">

si il s'agit d'un dossier virtuel il ne faut rien mettre
<link rel="canonical" href="http://www.tonsite.com/">

et pour le style
<link href="/style.css" rel="stylesheet" type="text/css" />

Le dossier précisé dans le canonical existe vraiment, c'est dans celui-ci qu'est mon site, en fait.

si je mets un / devant les styles,
<link href="/css/style.css" rel="stylesheet" type="text/css" />
il tente (et n'y parvient pas) de trouver ma css à cette adresse :
http://www.monsite.fr/css/style.css

Or, ma css est à cette adresse :
http://www.monsite.fr/dossier/css/style.css

Il ne prend pas en compte le dossier que je lui donne dans le canonical :
<link rel="canonical" href="http://www.monsite.fr/dossier/">


En tout cas, merci pour ton aide. J'aime beaucoup ta façon de préciser le code à chaque variante... :D
 
WRInaute occasionnel
Je ne sais pas si vous connaissez le site le site : http://www.generateit.net/mod-rewrite/
il permet de générer les urlrewritting

il me propose de mettre mon url dynamique : http://www.domaine.com/photo-vacance/selection-categorie.php?nom_cat=ahaha
et après plusieurs configs je mets comme je le souhaitais http://www.domaine.com/photo-vacance/ahaha

Le dossier "photo-vacance" existe bien...

voici ce qu'il me propose... maissss ça ne marche pas :

RewriteEngine On
RewriteRule ^photo-vacance/([^/]*)$ /photo-vacance/selection-categorie.php?nom_cat=$1 [L]

j'ai un ami qui me proposer de partir sur ça : RewriteRule ^/(.+)/(.+)[/]?$ selection-categorie.php?nom_cat=$2 [L,QSA]
 
Nouveau WRInaute
jiojioforever a dit:
Je ne sais pas si vous connaissez le site le site : http://www.generateit.net/mod-rewrite/
il permet de générer les urlrewritting

il me propose de mettre mon url dynamique : http://www.domaine.com/photo-vacance/selection-categorie.php?nom_cat=ahaha
et après plusieurs configs je mets comme je le souhaitais http://www.domaine.com/photo-vacance/ahaha

Le dossier "photo-vacance" existe bien...

voici ce qu'il me propose... maissss ça ne marche pas :

RewriteEngine On
RewriteRule ^photo-vacance/([^/]*)$ /photo-vacance/selection-categorie.php?nom_cat=$1 [L]

j'ai un ami qui me proposer de partir sur ça : RewriteRule ^/(.+)/(.+)[/]?$ selection-categorie.php?nom_cat=$2 [L,QSA]

Je pense que c'est le même soucis que le miens, un soucis de répertoire virtuel, ici le 1er photo-vacance dans ce que te propose le site.

Essai de mettre la fameuse condition citée plus haut pour voir si ça marche. Bonne chance ;)
 
WRInaute accro
thomasg a dit:
Il ne prend pas en compte le dossier que je lui donne dans le canonical :
<link rel="canonical" href="http://www.monsite.fr/dossier/">

tu dois te planter quelque part, je n'avais jamais utiliser de rep physique pour du virtuel, j'ai fait un test et come attendue voici le résultat:

"test" est un répertoire physique
"rep1" "rep2" "rep3" sont des virtuels

la regle
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/(.+)/(.+)/contact\.html$ /test/contact.php [L]

le header
<link rel="canonical" href="http://www.site.com/test/">
<link href="/style.css" rel="stylesheet" type="text/css" />

LE TEST :
-http://www.annevalerie.com/test/rep1/rep2/rep3/contact.html
 
Nouveau WRInaute
KOogar a dit:
thomasg a dit:
Il ne prend pas en compte le dossier que je lui donne dans le canonical :
<link rel="canonical" href="http://www.monsite.fr/dossier/">

tu dois te planter quelque part, je n'avais jamais utiliser de rep physique pour du virtuel, j'ai fait un test et come attendue voici le résultat:

"test" est un répertoire physique
"rep1" "rep2" "rep3" sont des virtuels

la regle
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/(.+)/(.+)/contact\.html$ /test/contact.php [L]

le header
<link rel="canonical" href="http://www.site.com/test/">
<link href="/style.css" rel="stylesheet" type="text/css" />

LE TEST :
-http://www.annevalerie.com/test/rep1/rep2/rep3/contact.html


Lorsque tu précises "/test/" dans ta règle, j'ai l'impression que ton .htaccess n'est pas DANS le répertoire physique, mais un niveau plus haut. Or dans mon cas, le .htaccess est dans le repertoire physique (au même niveau que index.php)


Voici mon arborescence :
Code:
    www/
    |- pilote/
       |-index.php
       |-.htaccess (celui que j'édite)
       |-css/
          |-style.css
       |-includes/
          |- ...

Est-ce que ce que tu écris correspond aussi à mon cas ?

A savoir que j'ai aussi des pages qui ont besoin des même CSS et autre fichiers en include mais qui elles ne doivent pas simuler de dossier. On peut faire les deux en même temps ?

Encore merci,
Thomas.
 
WRInaute accro
j'ai placer le .htaccess dans le repertoire physique "test" sans modifier la réécriture et la page s'affiche normalement

Code:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/(.+)/(.+)/contact\.html$  /test/contact.php [L]

le TEST:
-http://www.annevalerie.com/test/rep_virtuel/rep_virtuel/rep_virtuel/contact.html
 
Nouveau WRInaute
KOogar a dit:
j'ai placer le .htaccess dans le repertoire physique "test" sans modifier la réécriture et la page s'affiche normalement

Code:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/(.+)/(.+)/contact\.html$  /test/contact.php [L]

le TEST:
-http://www.annevalerie.com/test/rep_virtuel/rep_virtuel/rep_virtuel/contact.html

Si je mets / dans mes urls relatives, ça ne fonctionne pas.

LINK :
<link rel="canonical" href="http://localhost/redirection/" />

LIEN RELATIF :
<a href="/page1.html">Page 1</a>
Lorsque je clic, il m'envoit vers http://localhost/page1.html
<a href="/dossier/spage1.html">Sous-page 1</a>
Lorsque je clic, il m'envoit vers http://localhost/dossier/spage1.html au lieu de http://localhost/redirection/dossier/spage1.html

De même pour les inclusions :
<link href="/css/reset.css" rel="stylesheet" type="text/css" />
Il va chercher : http://localhost/css/reset.css et non http://localhost/redirection/css/reset.css

HTACCESS:
Code:
# Interdit le listage d'un répertoire
IndexIgnore *

# Le serveur doit suivre les liens symboliques :
Options +FollowSymlinks

# Activation du module de réécriture d'URL :
RewriteEngine on

#Règles de réécriture
RewriteRule ^page1\.html$   /redirection/index.php?p=1 [L]
RewriteRule ^page2\.html$   /redirection/index.php?p=2 [L]
RewriteRule ^page3\.html$   /redirection/index.php?p=3 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/spage1\.html$   /redirection/index.php?sp=1 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/spage2\.html$   /redirection/index.php?sp=2 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/spage3\.html$   /redirection/index.php?sp=3 [L]

Bizarre... c'est normal ? :s
 
WRInaute accro
Quand tu clic sur <a href="/dossier/spage1.html">Sous-page 1</a> il t'envoit sur http://localhost/dossier/spage1.html
ben tout va bien !!! Chez moi c'est qu'il y a de plus normal :) je vois pas en quoi ca te pose problème;

pour info tu peux reduire tes regles comme ceci
Code:
RewriteRule ^page([0-9]+)\.html$   /redirection/index.php?p=$1  [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/spage([0-9]+)\.html$   /redirection/index.php?sp=$2 [L]

tu veux faire quoi au juste parceque c'est pas kler ton problème.. rien compris a tes redirections, et je comprend de moins en moins ton probleme :? surtout que je t'ai bardé d'exemples valident.
 
Nouveau WRInaute
KOogar a dit:
Quand tu clic sur <a href="/dossier/spage1.html">Sous-page 1</a> il t'envoit sur http://localhost/dossier/spage1.html
ben tout va bien !!! Chez moi c'est qu'il y a de plus normal :) je vois pas en quoi ca te pose problème;

pour info tu peux reduire tes regles comme ceci
Code:
RewriteRule ^page([0-9]+)\.html$   /redirection/index.php?p=$1  [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/spage([0-9]+)\.html$   /redirection/index.php?sp=$2 [L]

tu veux faire quoi au juste parceque c'est pas kler ton problème.. rien compris a tes redirections, et je comprend de moins en moins ton probleme :? surtout que je t'ai bardé d'exemples valident.

Bon, je vais essayer de repartir de zéro pour t'expliquer tout cela clairement. Je suis en train de créer un CMS à 2 niveaux de pages. Les pages (qui ne nécessite pas de simuler un dossier) et les sous-pages (qui nécessite de simuler un sous-dossier dont le nom est celui de sa page-mère).

Par exemple, si j'ai une page "Produits" qui contient "Voitures", "Moto" et "Camion", j'aimerai qu'elle s'affichent avec l'url :
http://www.monsite.fr/produits/voiture.html, http://www.monsite.fr/produits/moto.html, ... le répertoire "produits" n'existe PAS physiquement. Je dois donc le simuler. A savoir que les pages n'existe pas non plus, la redirection me sert à remplacer "camion.html" en "index.php?p=2", mon script faisant le nécessaire pour lire le contenu concerné en BDD et l'afficher dans la page (à partir d'une UNIQUE page "index.php" présente à la racine).

Grâce à ton aide, j'y suis parvenu, j'arrive a simuler un dossier en affichant les bonnes données dans la page & co SAUF que :
> S'il s'agit d'une page, tout est OK,
> S'il s'agit d'une sous-page, le contenu (BDD) est OK mais les includes que je fais dans le fichier index.php ne sont valide que pour les pages ne simulant pas d'arborescence.

Explication : Étant donné le faux dossier, le serveur va chercher les fichiers à inclure relativement au faux dossier, or celui-ci n'existe pas. J'ai donc rajouté un slash devant tous les inclusions (comme conseillé), nouveau soucis :
> Que ce soit pour une page ou une sous-page, le serveur ne va plus chercher les fichiers à la racine du site, mais encore un niveau au-dessous :
Au lieu de http://localhost/redirection/include/fichierainclure.php
Il va à http://localhost/include/fichierainclure.php (et ce, qquesoit le niveau)

Je ne comprends pas pourquoi il rebrousse d'un niveau. J'ai pourtant bien mis le canonical : http://localhost/redirection/
J'imagine que c'est à cela que ça sert.

J'espère que j'ai été plus clair. Sinon, je suis désolé et tenterait de me débrouiller avec tout l'aide que tu m'as déjà apporté.

PS : Pour la simplification des règles, je ne peux pas, mes pages sont nommées dans le genre :
produitlegervoiture.html, produitmachinchose.html, blablabla, donc à chaque nom correspond un ID de page en BDD. :D Mais merci :)

PS2 : J'arrive à résoudre mon problème en enlevant le canonical, en supprimant le slash au début des urls relatives et en ajoutant <base href="http://localhost/redirection/"> mais je doute fortement que ça soit la solution.


Encore merci à toi, KOogar... c'est la 1ère fois que je demande de l'aide sur le net et cela est fort appréciable de voir que certains aide comme si c'était leur travail.
 
WRInaute accro
Super tu avances :D

<base href="http://localhost/redirection/">
est une solution

avec la fonction dirname si tu restes en canonique, tu dois sans probleme retrouver le bon chemin de tes fichiers:
http://php.net/manual/en/function.dirname.php

Pour l'utiliser :
Code:
<?php 
include(dirname(__FILE__) . '/include/fichierainclure.php'); 
?>
 
Nouveau WRInaute
Juste pour dire merci, une dernière fois.

J'admire la patience de ceux qui prenne le temps de lire les messages au cas par cas pour y répondre.

Ton aide m'a apporté, KOogar, c'est la 1ère fois que je faisais d'la redirection.

Pour ma part, le soucis est résolu avec <base ...>, pour les suivants :wink: ça marche très bien. Je sais pas si j'dois mettre [Résolu] ou non dans le sujet, étant donné que j'suis pas l'auteur du 1er post.

Bien à vous tous,
Thomas.
 
Discussions similaires
Haut