La confusion entre les deux règles de réécriture d'url

0

La question

ces deux règles sont confus :

RewriteRule ^health-institute-([a-zA-Z\-]+)-([a-zA-Z\-]+)$ search.php?city=$1&speciality=$2 [L] 
RewriteRule ^health-institute-app-([a-zA-Z\-]+)$ search.php?city=$1 [L]

lorsque je veux atteindre health-institute-app-mycity (2ème règle) le serveur envisager app comme une valeur et d'essayer d'atteindre la search.php?city=app&speciality=mycity (1er article)

comment puis-je dire que ce sont deux règles distinctes?

.htaccess apache mod-rewrite
2021-11-23 10:56:12
1

La meilleure réponse

2

Oui, parce que la regex ^health-institute-([a-zA-Z\-]+)-([a-zA-Z\-]+)$ dans la première règle correspond également à health-institute-app-mycity.

Vous avez besoin d'inverser ces deux directives, de sorte que la règle plus spécifique est le premier.

Par exemple:

RewriteRule ^health-institute-app-([a-zA-Z-]+)$ search.php?city=$1 [L]
RewriteRule ^health-institute-([a-zA-Z-]+)-([a-zA-Z-]+)$ search.php?city=$1&speciality=$2 [L] 

(Pas besoin de barre oblique inversée échapper le trait d'union lorsque, au début ou à la fin de la classe de caractères.)

TOUTEFOIS, l'expression régulière dans le (maintenant) la deuxième règle est potentiellement ambiguë, car le trait d'union (-) est utilisé pour délimiter les deux valeurs (city et speciality), mais le trait d'union est également inclus à la fois dans les classes de caractères, de sorte qu'il peut sans doute faire partie des valeurs elles-mêmes. Toutefois, les deux city et speciality ne peut à la fois contenir des traits d'union, en dépit de la regex apparemment autoriser cela.

Par exemple, comment faut-il une demande pour health-institute-foo-bar-baz-qux - il être résolu? Depuis le quantificateur + est gourmand, ce sera actuellement résultat dans search.php?city=foo-bar-baz&speciality=qux. Si il y a toujours un trait d'union dans le speciality (comme l'a suggéré cela pourrait être le cas par la regex) il ne sera jamais égalé.

2021-12-09 22:55:14

@narseoh en Fait, depuis que ces valeurs sont séparées par un trait d'union, y compris par le trait d'union dans les classes de caractères (ie. les valeurs elles-mêmes peuvent contenir un trait d'union) vous sont en train d'introduire une ambiguïté. par exemple. Ce qui devrait health-institute-foo-bar-baz-qux résoudre? Peut le city contiennent des traits d'union?
MrWhite

Oui en effet, certaines villes ont un trait d'union dans le nom de la ville et d'autres villes ont deux mots, l'espace est remplacé par un trait d'union dans l'url
narseoh

@narseoh OK, donc la speciality jamais contient un trait d'union? (Sinon, il va devenir une partie de la city.) Auquel cas, le trait d'union doit être retirée de la speciality classe de personnage, pour supprimer cette ambiguïté/confusion, car il est superflu.
MrWhite

merci @MrWhite , en fait de même spécialité pourrait avoir un trait d'union qui rend les choses un peu plus compliqué pour moi. Je l'ai pensé et remplacer (-) par (/) pour séparer les données, qui a dit que j'avais d'autres questions (je vais créer un autre thread à ce sujet)
narseoh

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................