Apache RewriteRule и логика пропуска - PullRequest
0 голосов
/ 23 августа 2010

Я в значительной степени ударил стену здесь. Насколько я могу сказать, это должно работать, но это не так.

У меня есть локальный адрес разработки с поддоменом подстановочных знаков * .localhost и дружественные URL-адреса / / 0-9 / somestring. То, что я пытаюсь сделать, это иметь от username.localhost/1/page до localhost?pageId=1&username=username. Сложность заключается в попытке заставить работать обе домашние страницы на username.localhost, а также отдельные страницы, то есть username.localhost / 1 / page.

RewriteRule ^([0-9]+)/[a-zA-Z0-9\-\_\,\.]+$ - [S=1]
RewriteCond %{HTTP_HOST} !^www.* [NC]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.localhost
RewriteRule ^index.php$ index.php?username=%1
RewriteRule ^([0-9]+)/[a-zA-Z0-9\-\_\,\.]+$ index.php?pageId=$1&username=%1

Для страниц / 1 / page первое правило предназначено для пропуска совпадений и пропусков, но не может правильно переписать. Однако, если я удалю первые 2 правила, он прекрасно перезапишет страницы / 1 / page.

Это как если бы оно не пропускалось, но если я изменяю его на S = 2, оно пропускает оба правила. Argh. Есть идеи?

1 Ответ

1 голос
/ 23 августа 2010

Из того, что я могу сказать, на самом деле делает то, что вы ожидаете.Только после того, как он это сделает, у него есть второй ход в вашем наборе правил, который все портит.То, что происходит, выглядит более конкретно так:

  • Запрос на http://username.localhost/1/page выполнен
  • Ввод 1/page соответствует первому правилу, S=1 применяется
  • Вход 1/page соответствует третьему правилу, URL переписывается на index.php?pageId=1&username=username
  • Внутреннее перенаправление выполняется mod_rewrite (пока все хорошо, но ...)
  • mod_rewrite обрабатывает внутреннее перенаправление и снова начинает обработку правил
  • Ввод index.php не соответствует первому правилу, S=1 не применяется
  • Ввод index.php соответствуетвторое правило, URL перезаписывается на index.php?username=username
  • (внутреннее перенаправление происходит снова, выполняется то же переписывание, но mod_rewrite обнаруживает цикл перенаправления и прекращает обработку сейчас)

Есть несколько различных способов исправить это, но я думаю, что самый простой здесь - просто убедиться, что файл не существует, а затем свернуть шаблон из последнего правила в условие для предыдущего:

# Make sure we haven't rewritten to a file yet (the "directory" gets processed
# before DirectoryIndex index.php is applied)
RewriteCond %{REQUEST_FILENAME} !-f
# Check that the input doesn't match the pattern we want handled later
RewriteCond $0           !^([0-9]+)/[a-zA-Z0-9_,.-]+$
RewriteCond %{HTTP_HOST} !^www.* [NC]
RewriteCond %{HTTP_HOST}  ^([^\.]+)\.localhost
RewriteRule ^.*$ index.php?username=%1

RewriteRule ^([0-9]+)/[a-zA-Z0-9_,.-]+$ index.php?pageId=$1&username=%1

Редактировать : ThВышеприведенная версия также ловит вещи, которые не соответствуют шаблону вашей страницы, и ведет себя так, как будто они были index.php?username=username, что может быть нежелательно.Следующее позволит избежать этого и в любом случае будет немного более кратким:

RewriteCond %{HTTP_HOST} !^www.* [NC]
RewriteCond %{HTTP_HOST}  ^([^\.]+)\.localhost
RewriteRule ^$ index.php?username=%1

RewriteRule ^([0-9]+)/[a-zA-Z0-9_,.-]+$ index.php?pageId=$1&username=%1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...