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.