Rescrie regula ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]
„Problema” cu aceasta este că se va potrivi și cu o solicitare pentru /John Smith (al 2-lea grup este opțional), dar rescrie cererea către pages.php?PAGE=john-smith&LINK=, în loc de pages.php?LINK=john-smith după cum este necesar. Pentru aceasta veți avea nevoie de o regulă separată. Se potrivește și /profil/john-smith/orice, aruncând /orice dar totuși rescrie cererea (o relație de mai multe la unu) care poate deschide site-ul dvs. pentru spammeri.
Presupunând că nu permiteți puncte (.) în segmentele de cale URL (conform exemplelor dvs.), atunci nu este nevoie să verificați dacă solicitarea nu se mapează la un fișier. de exemplu. o cerere pentru /profil/john-smith nu ar putea niciodată mapa la fișier dacă fișierele dumneavoastră au toate extensii de fișiere, deci verificarea sistemului de fișiere este redundantă.
Încercați următoarele:
# Rescrie exact un segment de cale
# de exemplu. /john-smith la pages.php?LINK=john-smith
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)$ pages.php?LINK=$1 [L]
# Rescrie exact două segmente de cale
# de exemplu. /profile/john-smith la pages.php?PAGE=profile&LINK=john-smith
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([^/.]+)$ pages.php?PAGE=$1&LINK=$2 [L]
The NC steag pe precedent RescrieCond directiva este probabil redundantă.
([^/.]+) - Am schimbat submodelul de captare pentru a exclude și punctele. Și a doua regulă se potrivește exact două segmente de cale, nu unul sau două segmente de cale, ca în exemplul dvs.