Jump to content

Regex pour URL Rewriting


MaamuT

Recommended Posts

Salut tatouss,

Trois jours que je bloque sur une con…………ie…

Dans mon htaccess j’ai plusieurs règles plutôt simples du genre :

 

RewriteRule \-([a-z]+)\.html$ /index.php?i=$1 [L]
Maintenant, je voudrais récupérer le dernier terme du $_SERVER['REQUEST_URI'] si celui-ci ne se termine PAS par -[0-9].html (un tiret immédiatement suivi d’un ou plusieurs chiffres immédiatement suivis de la chaîne .html)

En gros :

Adresse sous la forme : domain.tld/truc (quelque soit sa longueur et le nombre de répertoires ou sous répertoire du moment qu’elle ne se termine PAS par une barre oblique) => il me renvoie index.php?s=truc (c’est là que je bloque !)

Adresse sous la forme : domain.tld/truc/ (quelque soit sa longueur et le nombre de répertoires ou sous répertoire du moment qu’elle se termine AVEC une barre oblique) => il me renvoie index.php?s=truc aussi (c’est là que je bloque !)

Adresse sous la forme : domain.tld/truc.html => index.php?s=truc (ok pour celle-ci)

Adresse sous la forme : domain.tld/[truc/]machin-2.html => index.php?i=2 (ok pour celle-ci)

Par convention :

- Il n’y à pas de cas ou on est dans un sous-sous-sous(n) répertoire, seul le premier est accepté, les autres sont ignorés, mais leurs présences ne provoquent pas de 404.

- Toutes les URLs diffusées seront sous la forme : h**p://www.domain.tld/section/article-[0-9].html

- Toute autre URL ne se terminant pas par .html ou n’intégrant PAS la chaîne -[0-9] sera interprétée comme cherchant à accéder à une section du site et affichera la page d’accueil de la section, sinon, la page affiche l’article demandé.

J’ai essayé 223 872 solutions plus ou moins ressemblantes et j’ai toujours le même souci quand je pose le dernier ? juste avant le $ de fin pour exclure la dernière paire capturante !

 

RewriteRule [a-z]+(\.html)?$ /index.php?i=$1 [L]
J’ai fouillé du côté de la détection du type de document demandé, étant donné que la présence de la barre oblique finale indique implicitement un répertoire et son absence un fichier, mais euh… jpatoucompris :transpi:
Link to comment
Share on other sites

Bon, dans le genre, le mec il aime se compliquer la vie…

Je capte juste la présence de -n.html

 

(?:[a-z])?\-([0-9]+)\.html$ /rep/repertoire/index.php?i=$1 [L]
Si oui je balance sur une page qui récupère l'article $i

Si non, je balance dans une autre dans laquelle je traite ma REQUEST_URI avec un bête strrchr()

 

$filetype = (substr(strrchr($path, "/"), 1) != '') ? 'fichier' : 'dossier';
Tout simplement.

Excellente cette discussion avec moi même ;)

Peut être même à suivre ;)

Link to comment
Share on other sites

Dans mon htaccess j’ai plusieurs règles plutôt simples du genre : 

RewriteRule \-([a-z]+)\.html$ /index.php?i=$1 [L]
Maintenant, je voudrais récupérer le dernier terme du $_SERVER['REQUEST_URI'] si celui-ci ne se termine PAS par -[0-9].html (un tiret immédiatement suivi d’un ou plusieurs chiffres immédiatement suivis de la chaîne .html)

 

Avec RewriteRule, Un "!" (sans les guillemets) en préfixe de l'expression rationnelle en inverse le comportement. En conséquence, cette ligne devrait t'aider à atteindre ton objectif :

RewriteRule RewriteRule !-([0-9]+)\.html$ /index.php?i=$1 [L]

Note que le [L] final indique que, si l'expression est vérifiée, la redirection (effective ou transparente) sera appliquée et la suite du fichier .htaccess sera ignorée.

 

Note qu'Apache interprète les .htaccess de toute l'arborescence précédente. Ainsi avec une URL de type :

http://www.example.com/premier/second/troisieme/article-0.html

Apache recherchera et appliquera le cas échéant les .htaccess suivants :

 

  • /.htaccess

  • /premier/.htaccess
  • /premier/second/.htaccess

  • /premier/second/troisieme/.htaccess

Si l'un des premiers .htaccess exécute une redirection terminée avec [L], les suivants seront en toute logique ignorés.

Link to comment
Share on other sites

Donc à suivre alors ;)

 

Super merci,

 

J’ai finalement laissé tomber pour une tout autre raison, les URL internes relatives…

 

La racine des liens relatifs des pages est celle de la page virtuelle demandée et comme elle n’arrête pas de bouger, aucune référence ne peut être garantie.

 

Il y’a aussi un comportement hallucinant de Safari qui est devenu grâce à Yosemite le pire logiciel qu’un développeur web puisse utiliser, ou le meilleur si sa vocation est de faire des bouses…

 

Une solution est de faire comme WordPress et mettre des adresses absolues partout… où bien encore la balise meta base   :gne:  

 

Sauf que j’ai mes limites, et l’hérésie en est une, mettre des URL absolues pour identifier une page ou un élément local, ouaouh !

 

Bon, pour rire je suis allé voir un peu les stats d’un site sous WordPress, ça vaut le détour, je crois d’ailleurs que je vais petit à petit apprendre à m’en passer :fumer:

 

Par contre, j’ai deux gros pavés sur les REGEX et pas un ne parle du ! (symbole que je connais bien pour dev depuis belle lurette), mais je ne savais pas que l’on pouvait les utiliser dans les .htaccess, merci pour le tuyau (au passage, merci pour les autres, mais je savais pour le [L] :mad2:)

 

Petite question bête, tu parles d’arborescence, si j’ai bien compris, un fichier appelé depuis le rep/rep1/rep2/fichier sera quand même pris en compte par le .htaccess de la racine, mais si au contraire on ne veut pas que les .htaccess supérieures soient prises en compte ?

 

Inherit none ou disabled ou un truc du genre non ?

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...