Confuzie între două rescrie url-urile reguli

0

Problema

aceste două reguli sunt confuz :

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]

când vreau să ajung health-institute-app-mycity (Regula 2) server-ul ia în considerare app ca o valoare și să încerce să ajungă search.php?city=app&speciality=mycity (Regula 1)

cum pot spune că acestea sunt două norme separate?

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

Cel mai bun răspuns

2

Da, pentru că regex ^health-institute-([a-zA-Z\-]+)-([a-zA-Z\-]+)$ în prima regula, de asemenea, meciuri health-institute-app-mycity.

Ai nevoie pentru a inversa aceste două directive cu atât mai mult specifice regulă este primul.

De exemplu:

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] 

(Nu este nevoie să backslash-escape cratimă atunci când, la începutul sau la sfârșitul clasa de caracter.)

Cu toate ACESTEA, regex (acum) de-a doua regulă este potențial ambiguu, deoarece cratima (-) este folosit pentru a delimita cele două valori (city și speciality), dar cratima este, de asemenea, incluse în ambele clase de caractere, astfel încât acesta poate fi probabil o parte din valorile ei înșiși. Cu toate acestea, ambele city și speciality nu poate ambele conțin cratime, în ciuda regex aparent permite acest lucru.

De exemplu, cum ar trebui să o solicitare pentru health-institute-foo-bar-baz-qux fi rezolvate? Deoarece cuantificator + este lacom, în prezent acest lucru va duce la search.php?city=foo-bar-baz&speciality=qux. Dacă există vreodată o cratimă în speciality (cum a sugerat acest lucru ar putea fi cazul de regex) nu va fi niciodată egalată.

2021-12-09 22:55:14

@narseoh de Fapt, deoarece aceste valori sunt delimitate printr-o cratimă, inclusiv prin cratima în clase de caractere (de exemplu. valorile se pot conține o cratimă) introduceți o ambiguitate. de exemplu. Ce ar trebui să health-institute-foo-bar-baz-qux hotărârea de a? Poate city conține cratime?
MrWhite

Da, într-adevăr, unele orașe au o cratimă în numele orașului și în alte orașe au două cuvinte, spațiul este înlocuit de cratimă în url-ul
narseoh

@narseoh OK, deci speciality nu conține o cratimă? (În caz contrar, acesta va deveni parte din city.) În cazul în care cratima ar trebui să fie eliminate din speciality clasa de caracter, pentru a elimina această ambiguitate/confuzie, deoarece este de prisos.
MrWhite

multumesc @MrWhite , de fapt, chiar de specialitate ar putea avea o cratima, ceea ce face lucrurile un pic mai complicat pentru mine. M-am gândit și înlocuit (-) cu (/) pentru a separa datele, care a spus am avut alte probleme (voi crea un alt thread despre asta)
narseoh

În alte limbi

Această pagină este în alte limbi

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