Aller au contenu

Sujets conseillés

Posté

Bonjour, j'ai une RewriteRule qui fonctionne impec sur mon hébergement (UNIX), alors que ça me donne un Not Found en local sous windows.

Voici la règle en question :

RewriteRule ^news/([0-9]+)-([a-zA-Z0-9\-\.]+).html$ /index.php?page=news.php&id_news=$1&permalien=$2 [L]

Et l'URL : http://localhost/news/28-after-effects-cs4.html

Ce sont les dash (-) qui posent problème, parce que quand je demande /news/28-after.html par exemple, j'ai pas d'erreur Apache.

Alors, c'est quoi ce bin's ?

Merci de votre aide.

Posté

Je ne sais pas quelle implémentation de regex Apache utilise (il y en a une dans le source, mais peut-être qu'il utilise celle du système quand il y en a une? Flemme de vérifier), mais dans certaines, pour inclure un "-" dans une liste entre crochets, il faut le mettre en premier (non escapé). Dans d'autres tu peux le mettre en premier ou en dernier au choix, pas escapé non plus.

Donc [-A-Z], pas [A-Z-] ou [A-Z\-].

Alternativement tu peux utiliser des notations type (a|B) donc par exemple ([A-Z]|-) mais ça peut poser des problèmes si tu dois récupérer des paramètres (dans les implémentations un peu sympa des regex tu peux utiliser (?:texte) pour que les () ne soient pas capturantes, mais je ne pense pas que ce soit le cas dans celles d'Apache.

Jacques.

Posté

Ton hébergement doit être chez OVH ;)

Dans ta règle, supprime le / devant index.php du second argument !

Dan

Posté

Oui je suis chez OVH, mais de toute façon, chez OVH cette règle fonctionne nickel, c'est en local que ça posait problème.

Parce que j'ai résolu le problème en ajoutant un dash à la fin de la seconde classe : ([a-zA-Z0-9\-\.-]+). Et maintenant ça fonctionne !

Je n'aime pas trop faire des trucs que je ne comprends pas, même si ça marche. Donc à quoi il sert ce tiret ?

Posté

Le / devant le second argument n'est nécessaire que chez OVH parce qu'ils ont leur propre module de réécriture.

C'est pour cela que je te disais de l'enlever EN LOCAL !

Dan

Posté
A bracket expression is a list of characters enclosed in `[]'. It nor-

mally matches any single character from the list (but see below). If the

list begins with `^', it matches any single character (but see below) not

from the rest of the list. If two characters in the list are separated

by `-', this is shorthand for the full range of characters between those

two (inclusive) in the collating sequence, e.g. `[0-9]' in ASCII matches

any decimal digit. It is illegal= for two ranges to share an endpoint,

e.g. `a-c-e'. Ranges are very collating-sequence-dependent, and portable

programs should avoid relying on them.

To include a literal `]' in the list, make it the first character (fol-

lowing a possible `^'). To include a literal `-', make it the first or

last character, or the second endpoint of a range. To use a literal `-'

as the first endpoint of a range, enclose it in `[.' and `.]' to make it

a collating element (see below). With the exception of these and some

combinations using `[' (see next paragraphs), all other special charac-

ters, including `\', lose their special significance within a bracket

expression.

En clair: si tu veux mettre un "-" entre des [], il faut le mettre au début ou à la fin, comme je le disais précédemment, et "\" n'a pas sa signification habituelle entre [], pas plus que ".". Donc tu revrais écrire [a-zA-Z0-9.-]. Moi je conseillerais même [-a-zA-Z0-9.], il me semble avoir vu dans une vie antérieure des implémentations qui n'acceptent le "-" qu'en première position (il faut le mettre à des endroits particuliers pour faire la différence entre un "-" litéral et un "-" qui indique un range, et la syntaxe historique ne prévoit pas qu'on puisse utiliser \ pour ça, mais qu'on le mette a des endroits particuliers).

Ceci étant dit je ne sais pas très bien pourquoi ça marche chez OVH, il doit y avoir une implémentation différente des regex sur cette machine-là je pense (il y en a à peu près autant que de versions différentes d'OS...).

Jacques.

Posté

Ah oui c'est ça, merci.

J'avais déjà eu des problèmes similaires avant, du coup j'avais remplacé le - par ,

Maintenant je vais pouvoir utiliser les dash comme bon me semble !

Merci pour vos réponses.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...