Правило перезаписи ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]
«Проблема» с этим в том, что он также будет соответствовать запросу на /Джон Смит
(2-я группа необязательна), но переписывает запрос на pages.php?PAGE=john-smith&LINK=
, вместо pages.php?LINK=Джон-Смит
как требуется. Для этого вам понадобится отдельное правило. Это также соответствует /профиль/джон-смит/что-нибудь
, отбрасывая /что-либо
но по-прежнему переписывает запрос (отношение «многие к одному»), что потенциально открывает ваш сайт для спамеров.
Предполагая, что вы не разрешаете точки (.
) в сегментах URL-адреса (согласно вашим примерам), тогда нет необходимости проверять, что запрос не сопоставляется с файлом. например. запрос на /profile/джон-смит
никогда не сможет сопоставиться с файлом, если все ваши файлы имеют расширения файлов, поэтому проверка файловой системы является избыточной.
Вместо этого попробуйте следующее:
# Переписать ровно один сегмент пути
# например. /john-smith to pages.php?LINK=john-smith
RewriteCond %{REQUEST_FILENAME} !-d
Правило перезаписи ^([^/.]+)$ pages.php?LINK=$1 [L]
# Переписать ровно два сегмента пути
# например. /profile/john-smith на pages.php?PAGE=profile&LINK=john-smith
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
Правило перезаписи ^([^/.]+)/([^/.]+)$ pages.php?PAGE=$1&LINK=$2 [L]
Северная Каролина
флаг на предыдущем RewriteCond
директива, вероятно, избыточна.
([^/.]+)
- Я изменил подшаблон захвата, чтобы исключить точки. И второе правило соответствует ровно двум сегментам пути, а не одному или же два сегмента пути, как в вашем примере.