Из того, что я могу сказать, на самом деле делает то, что вы ожидаете.Только после того, как он это сделает, у него есть второй ход в вашем наборе правил, который все портит.То, что происходит, выглядит более конкретно так:
- Запрос на
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