La confusione tra i due regole di riscrittura degli url

0

Domanda

queste due regole sono confuso :

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]

quando voglio raggiungere health-institute-app-mycity (2 ° regola) il server in considerazione app come un valore e cercare di raggiungere search.php?city=app&speciality=mycity (Regola 1)

come faccio a dire che queste sono le due regole distinte?

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

Migliore risposta

2

Sì, perché la regex ^health-institute-([a-zA-Z\-]+)-([a-zA-Z\-]+)$ la prima regola corrisponde anche health-institute-app-mycity.

È necessario invertire queste due direttive, quindi, la regola più specifica è il primo.

Per esempio:

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] 

(Non c'è bisogno di protezione backslash il trattino quando all'inizio o alla fine della classe di caratteri.)

TUTTAVIA, l'espressione regolare in (ora) seconda regola è potenzialmente ambiguo il trattino (-) è utilizzato per delimitare i due valori (city e speciality), ma il trattino è anche incluso in entrambe le classi di caratteri, in modo da può presumibilmente essere parte dei valori stessi. Tuttavia, entrambi city e speciality non è possibile contenere i trattini, nonostante l'espressione regolare, apparentemente, permettendo a questo.

Per esempio, come una richiesta di health-institute-foo-bar-baz-qux essere risolto? Dal momento che il quantificatore + è avido, questo risultato attualmente in search.php?city=foo-bar-baz&speciality=qux. Se non c'è mai un segno meno in speciality (come ha suggerito che questo potrebbe essere il caso per la regex) che non sarà mai trovata.

2021-12-09 22:55:14

@narseoh in Realtà, dal momento che questi valori sono separati da un trattino, compreso il trattino in classi di personaggi (ie. i valori di se stessi può contenere un trattino) si è introdotto un ambiguità. es. Che cosa dovrebbe health-institute-foo-bar-baz-qux risolvere? Può l' city contengono trattini?
MrWhite

Sì, in effetti, alcune città hanno un trattino nel nome di città e di altre città hanno due parole, lo spazio è sostituito da un trattino nel url
narseoh

@narseoh OK, l' speciality non contiene un trattino? (In caso contrario, diventerà parte del city.) In questo caso il trattino deve essere rimosso dal speciality classe di caratteri, per rimuovere l'ambiguità/confusione, dato che è superfluo.
MrWhite

grazie @MrWhite , in realtà anche specialità potrebbe avere un trattino che rende le cose un po ' più complicato per me. Ci ho pensato e sostituito (-) con (/) per separare i dati, che ha detto che ho avuto altri problemi (vado a creare un altro thread)
narseoh

In altre lingue

Questa pagina è in altre lingue

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