htaccess, url rewriting...au secours !

j'ai la regex qui me démange

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous, Je m’attaque à présent à l’arborescence de mon site, et à l’url rewriting, sur lequel je rencontre pas mal de difficultés (vu que moi et les regex, ça fait 2(puissance infinie).

voici quelques urls de mon site :

j’ai lu quelques tutos sur le sujet, mais j’ai un problème : ces tutos n’explique pas la procédure à suivre en cas de paramètre GET Optionnels. Si j’omet un ou plusieurs paramètres dans mon url, je tombe sur un 404.

Merci par avance à ceux qui pourront m’apporter leur aide :) !

Édité par Air_maX

+0 -0

Cette réponse a aidé l’auteur du sujet

Tu as fait quoi ? Comment ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Options -MultiViews +FollowSymlinks

RewriteEngine on
RewriteBase /

# ne pas réécrire tout ce qui existe physiquement (fichier ou répertoire)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^fr$ index.php?lang=fr [L,QSA]
RewriteRule ^fr/blog$ index.php?lang=fr&module=blog [L,QSA]
RewriteRule ^fr/blog/(.+)$ index.php?lang=fr&module=blog&page=$1 [L,QSA]

Maintenant si tu espérais pouvoir tout faire en une règle, c’est possible mais les $_GET['module'] et $_GET['page'] existeront toujours (isset renverra vrai) mais suivant qu’elles soint présentes ou non dans l’URL fera qu’elles sont ou non vides (== '' - ou empty si on veut)

J’entends ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Options -MultiViews +FollowSymlinks

RewriteEngine on
RewriteBase /

# ne pas réécrire tout ce qui existe physiquement (fichier ou répertoire)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^fr(?:/(blog)(?:/(.+))?)?$ index.php?lang=fr&module=$1&page=$2 [L,QSA]

Édité par vibrice

+1 -0
Auteur du sujet

Vache ! Merci vibrice !

Aurais-tu l’extrême gentillesse de décortiquer un peu ton code stp ? j’aime comprendre (et apprendre)les choses. J’ai tenté un bête copier-coller en attendant, qui me renvoi un jolie 500 :D !

+0 -0

J’ai tenté un bête copier-coller en attendant, qui me renvoi un jolie 500 :D !

Ben tu as quoi dans ton journal d’erreur d’Apache ?

Aurais-tu l’extrême gentillesse de décortiquer un peu ton code stp ?

Je veux bien expliquer une ou des choses précises mais certainement pas tout : je ne vais pas refaire un cours complet sur les regexp et la réécriture. Ca existe déjà, il y a la doc et ce serait trop long pour un post de forum.

Édité par vibrice

+0 -0
Auteur du sujet

Je ne te demande pas de tout me décrire, (d’ailleurs, ma demande initiale n’était pas un code tout prêt, mais un bon lien de tuto ;) )je te suis très reconnaissant pour le temps que tu m’accorde :)

Pour les log, voici quelques liens testé, et leurs résultats :

une idée ? o_O

+0 -0

Arf, désolé, j’ai écrit RewriteRule au lieu de RewriteCond (c’est édité). Je pensais vraiment avoir écrit RewriteCond sur le coup.

d’ailleurs, ma demande initiale n’était pas un code tout prêt, mais un bon lien de tuto ;)

Ce n’est pas du tout en ce sens que j’ai compris ta demande. Tu dis en plus être nul en regexp, ce qui est encore un autre sujet bien distinct de la réécriture.

Et puis, la fin de ton post est imprécise :

ces tutos n’explique pas la procédure à suivre en cas de paramètre GET Optionnels. Si j’omet un ou plusieurs paramètres dans mon url, je tombe sur un 404

Tu étais parti comment ? Tu aurais voulu obtenir quoi ? Pour et avec quoi ? Un(des) exemple(s) ?

Édité par vibrice

+0 -0
Auteur du sujet

Bonjour vibrice. Désolé, pas eu une minute pour me connecter cette semaine !

voici ce que j’avais écris :

1
2
3
4
5
RewriteRule ^([\w-]+)*$  master.php?lang=$1  [L]
RewriteRule ^([\w-]+)/([\w-]+)*$  master.php?lang=$1&module=$2  [L]
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)*$  master.php?lang=$1&module=$2&page=$3  [L]
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)*$  master.php?lang=$1&module=$2&page=$3&target=$4  [L]
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)*$  master.php?lang=$1&module=$2&page=$3&target=$4&extra=$5  [L]

soit une version pour chaque possibilité de mon url (de 1 à 5 variables), ce qui est très lourd je trouve, pas moyen de faire plus simple ?

un autre truc qui me dérange dans ma regex, c’est que des url du type

"monsite.com/voici/un-bon/format/d-url"

sera accepter, et jusqu’ici tout va bien, mais sera aussi accepté des url du type

"monsite.com/voici-/-------------/un/-m-a-u-v-a-i-s-/format--------/--d--u--r--l--"

bref, je sait pas comment gérer le tiret, en gros, je crois qu’il ne devrait être accepter que si il est entouré d’au moins une lettre, mais je sait pas si c’est faisable en regex, ni même comment le faire.(la, j’avoue que j’aurais bien besoin d’u vrai coup de pouce !)

+0 -0

Cette réponse a aidé l’auteur du sujet

un autre truc qui me dérange dans ma regex, c’est que des url du type

Pourquoi tu n’utilises pas un truc type ((?:\w+-?\w+)*) au lieu de ([\w-]+) ?

soit une version pour chaque possibilité de mon url (de 1 à 5 variables), ce qui est très lourd je trouve, pas moyen de faire plus simple ?

Si tu fais ça avec Apache, type RewriteRule ^([\w-]+)(?:/([\w-]+)(?:/([\w-]+)(?:/([\w-]+)(?:/([\w-]+))?)?)?)?$ master.php?lang=$1&module=$2&page=$3&target=$4&extra=$5 [L,QSA], ce n’est pas vraiment "propre" et $_GET['module'], par exemple, comme je l’ai dit, existera toujours (isset). Pour distinguer la présence du paramètre, il faudra la comparer avec '' (chaîne vide). Tu ne pourras guère faire plus générique puisque de toute façon Apache est limité à 9 captures.

Mais, dans ce cas, pourquoi ne pas prendre le problème à l’envers, à savoir faire ça (traiter l’URL) avec PHP ? Un FallbackResource /master.php et dans master.php tu traites/découpes $_SERVER['REQUEST_URI'] à ta guise.

Édité par vibrice

+1 -0
Auteur du sujet

Mais, dans ce cas, pourquoi ne pas prendre le problème à l’envers, à savoir faire ça (traiter l’URL) avec PHP ? Un FallbackResource /master.php et dans master.php tu traites/découpes $_SERVER['REQUEST_URI'] à ta guise.

vibrice

J’adore l’idée (et en plus, je sait faire en php), mais niveau indexation/référencement google et consort, je risque rien ? ça reste aussi transparent qu’avec les autres réécritures d’url ?

+0 -0

Cette réponse a aidé l’auteur du sujet

Absolument pas et c’est ce que font tous les frameworks. C’est juste un peu moins performant parce que la requête HTTP, pour ce qui n’existe pas physiquement, est d’abord envoyée à et traitée par PHP.

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte