Попробуйте использовать вместо этого:
RewriteRule ^user/?(([^/]+)/?)?$ /elements/scripts/view?pth=user&ext=$2 [QSA,NC,L]
Ваше правило является широким ... и оно перезаписывает другой URL-адрес без фиксированного назначения (не /index.php
или что-то в этом роде - я не могу сказать, является ли /elements/scripts/view
реальным файлом). или другой "виртуальный" путь).
Поскольку вам нужен URL, чтобы работать только с путем /user
, я жестко закодировал его в правиле - это делает правило более конкретным.
Это правило необходимо поместить в .htaccess в корневой папке веб-сайта. Для любого другого места требуется несколько небольших модификаций.
Разместите правило в соответствующем месте - порядок правил имеет значение .
«Я не уверен, работает ли это или нет, потому что флаг L
, кажется, не сработал, и он перезаписывает его, а затем переписывает его снова с pth=elements&ext=scripts/view
по какой-то причине».
После того, как Apache видит флаг [L]
, он перестает переписывать дальше (если правило соответствует, конечно) и переходит к Следующая итерация Запуск проверки всех правил с самого начала - так оно и работает, и многим кажется, не осознавать этого факта.
У вас могут быть некоторые другие правила, которые могут создавать такое поведение. Но, скорее всего, это делается по вашему текущему правилу - ваш шаблон (регулярное выражение) очень широк и может перехватить уже переписанный URL (/elements/scripts/view
) и переписать его снова (шаблон будет совпадать).
UPDATE:
На основании предоставленной вами дополнительной информации вместо них можно использовать эти правила (1 правило для всех):
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# Do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .+ - [L]
RewriteRule ^([a-z0-9]+)(/?(.*))$ /elements/scripts/view/index.php?pth=$1&ext=$3 [QSA,NC,L]
Эти правила не будут переписывать запросы к уже существующим файлам (например, файлам css / jpg / js).
Когда запрос будет отправлен на такой URL: mydomain.com/user/register-new
, он будет переписан на
/elements/scripts/view/index.php?pth=user&ext=register-new
и перезапись переходит к следующей итерации. На следующей итерации правило # 1 скажет Apache прекратить переписывать .. поскольку файл /elements/scripts/view/index.php
существует. Работа выполнена.
Если вышеприведенное не подходит по каким-либо причинам (например, вам все еще нужно переписать запросы к физически существующим файлам и динамически их обслуживать), используйте вместо этого:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/elements/scripts/view/index.php [NC]
RewriteRule ^([a-z0-9]+)(/?(.*))$ /elements/scripts/view/index.php?pth=$1&ext=$3 [QSA,NC,L]
RewriteCond
говорит Apache не переписывать URL, если он уже указывает на /elements/scripts/view/index.php
. Любой другой URL может быть переписан, если он будет соответствовать шаблону.
Имейте в виду, что из-за того, что я не знаю всех возможных URL-адресов, которые у вас могут быть (ваша структура URL), шаблон может требует небольшой настройки.