htaccess, url rewriting...au secours !

j'ai la regex qui me démange

Le problème exposé dans ce sujet a été résolu.

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 :) !

+0 -0

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]
+1 -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.

+0 -0

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

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) ?

+0 -0

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 !)

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.

+1 -0

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 ?

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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