Проблемы с htaccess mod_rewrite - PullRequest
0 голосов
/ 13 июля 2011

Я новичок в использовании файлов .htaccess, поэтому у меня возникают некоторые ошибки:

В частности, у меня три проблемы с моими попытками mod_rewrite.

Мне нужно, чтобы он мог анализировать ограниченные домены, такие как mydomain.com/user, и выдавать его за mydomain.com/elements/scripts/view/?pth=user и mydomain.com/user/register-new как mydomain.com/elements/scripts/view/?pth=user&ext=register-new

У меня сейчас есть:

RewriteRule ^/([A-Za-z0-9]+)/(.*)$ /elements/scripts/view?pth=$1&ext=$2 [NC,L]

Я не уверен, работает ли это или нет, потому что флаг L, кажется, не сработал, и он перезаписывает его, а затем переписывает его снова с pth=elements&ext=scripts/view по какой-то причине.

Другая проблема, с которой я столкнулся, заключается в том, что я могу знать, как она переписывается. Я хотел бы, чтобы mod_rewrite был невидим для пользователя (браузер по-прежнему отображает mydomain.com/user), но в настоящее время он заменяет URL-адрес браузера на замену RewriteRule.

Любая помощь будет принята с благодарностью, спасибо!

1 Ответ

0 голосов
/ 13 июля 2011

Попробуйте использовать вместо этого:

RewriteRule ^user/?(([^/]+)/?)?$ /elements/scripts/view?pth=user&ext=$2 [QSA,NC,L]
  1. Ваше правило является широким ... и оно перезаписывает другой URL-адрес без фиксированного назначения (не /index.php или что-то в этом роде - я не могу сказать, является ли /elements/scripts/view реальным файлом). или другой "виртуальный" путь).

  2. Поскольку вам нужен URL, чтобы работать только с путем /user, я жестко закодировал его в правиле - это делает правило более конкретным.

  3. Это правило необходимо поместить в .htaccess в корневой папке веб-сайта. Для любого другого места требуется несколько небольших модификаций.

  4. Разместите правило в соответствующем месте - порядок правил имеет значение .


«Я не уверен, работает ли это или нет, потому что флаг 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]
  1. Эти правила не будут переписывать запросы к уже существующим файлам (например, файлам css / jpg / js).

  2. Когда запрос будет отправлен на такой 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), шаблон может требует небольшой настройки.

...