2010-10-23 6 views

Répondre

0

Merci à tous, nous avons finalement eu cette

location ~* ^/xyz([^.]*)/([^.]*)$ { 
      rewrite ^/xyz([^.]*)/([^.]*)$ /xyz$1/index.php/$2 last; 
} 

et il fonctionne

1

Je ne pense pas que vous pouvez le faire sans une vérification séparée de regex pour vous assurer que ".php" est absent. Le problème est que les constructions comme .* engloutiront suffisamment de caractères pour s'assurer que votre lookahead négatif ne s'applique jamais.

1

Eh bien, comme l'a dit Michael, cependant. *? (Notez le '?') rendra la recherche non-gourmande et cela pourrait fonctionner.

... Ou bien, vous pouvez essayer (plutôt hackish):

[^.][^p][^h][^p] 

œuvres Puissance, peut-être pas ... Il est certainement une sorte de hack.

+0

C'est. difficile à lire, déboguer et nécessiterait pas mal de commentaires si on le laissait dans le code de l'application. Je pense que les hacks ne devraient être réservés que lorsqu'il n'y a pas d'autres solutions, et la solution est facile ici. –

+0

C'est faux. Il échoue lorsqu'au moins l'une des quatre classes de caractères ne peut pas être mise en correspondance. Mais cela ne devrait échouer que si tous ne peuvent être jumelés. – Gumbo

+0

Je pense que vous mélangez '[^ a] [^ b]' avec '[ab]' –

2

Vous devriez être plus précis sur le début et la fin de l'emplacement. Si .php ne devrait pas apparaître à la fin de l'emplacement, mis $ dans l'affirmation d'anticipation:

location ~* /(.*)xyz/(.*)(?!.*\.php$)(.*)$ {} 

Et si xyz devrait être un segment de chemin approprié et le premier segment de chemin (il doit commencer par /xyz/) , utilisez ceci:

location ~* ^/xyz/(?!.*\.php$)(.*)$ {} 
+0

Je suppose personnellement, étant donné le (. *) À la fin, que .php pourrait se retrouver avec quelque chose d'autre (paramètres probablement) après. Pourtant, les marqueurs $ et $ sont souvent oubliés et peuvent résoudre beaucoup de problèmes le cas échéant. :RÉ –

1

Celui-ci est simple, mais il peut être difficile à voir. La seconde (*) de l'expression régulière est "gourmande", par conséquent, elle va capturer tout ce qui inclut le ".php" donc, aux "yeux" de l'analyseur il n'y a pas de ".php" après (il est déjà passé) et le le résultat est un match. :(

Assurez le second * paresseux en changeant à * et il va résoudre votre problème..?

location ~* /(.*)xyz/(.*?)(?!\.php)(.*)$ {} 

Je vous suggère de lire this article, il explique d'une manière beaucoup mieux que moi .: D

Questions connexes