htaccess mod rewrite - как создать виртуальные поддомены?

Я хотел бы создать виртуальные поддомены через htaccess следующим образом.

Вход:

http://testuser.domain.com/1/2/3/

Должен обрабатываться как:

http://www.domain.com/user.php?id=testuser&var1=1&var2=2&var3=3

ОДНАКО, эта переработка должна использовать не user.php, а index.php, на случай, если кто-то введет:

http://www.domain.com or http://domain.com

Это то, что я получил до сих пор, однако, похоже, это не работает. Любая помощь от эксперта по переписыванию модов будет высоко оценена. Заранее спасибо.

Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^(www\.)?domain.com$ [NC]
RewriteRule ^(.*)/?(.*)/?(.*)/?$ index.php?var1=$1&var2=$2&var3=$3 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} !^(www|mail).domain.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+).domain.com$ [NC] 
RewriteRule ^(.*)/?(.*)/?(.*)/?$ user.php?id=%2&var1=$1&var2=$2&var3=$3 [NC,QSA,L]

person Yah    schedule 11.08.2010    source источник


Ответы (1)


Ваши правила на самом деле очень близки к тому, что вы от них хотите. Единственная проблема, которую я вижу, заключается в ваших тестовых шаблонах для ваших двух операторов RewriteRule. В настоящее время у вас есть

RewriteRule ^(.*)/?(.*)/?(.*)/?$ ...

... что эквивалентно этому:

RewriteRule ^(.*)$

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

Поскольку группы захвата в любом случае не должны захватывать косые черты, поскольку они используются здесь в качестве разделителя переменных, простое исправление состоит в том, чтобы изменить их на [^/]*, например:

Изменить: я также изменил набор RewriteCond во второй группе, чтобы игнорировать условие !-f в случае /index.php, что произойдет, если вы запросите поддомен без каких-либо данных после домена.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^(www\.)?domain.com$ [NC]
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?$ index.php?var1=$1&var2=$2&var3=$3 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} !^(www|mail).domain.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+).domain.com$ [NC] 
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?$ user.php?id=%2&var1=$1&var2=$2&var3=$3 [NC,QSA,L]
person Tim Stone    schedule 11.08.2010
comment
Привет Тим, Спасибо за ваш быстрый ответ. Я изменил файл htaccess, но проблема может быть в другом месте. Кажется, что файл user.php отображается только тогда, когда вместе с ним вводится переменная. Например: domain.com --› (показывает index.php) domain.com/1/2/3 --› (показывает index.php) testuser.domain.com/1/2/3 --› (показывает user.php) Пока все хорошо , НО: testuser.domain.com --› (показывает index.php) У вас есть идея, как Я могу сделать так, чтобы даже без каких-либо дополнительных переменных он всегда показывал user.php для поддомена? Наилучшие пожелания - person Yah; 11.08.2010
comment
О, упс, единственный сценарий, который я не тестировал. Я сделаю редактирование, которое должно позаботиться об этом. - person Tim Stone; 11.08.2010
comment
Привет, Тим, я снова настроил его, но он все еще не работает. Благодаря вашему последнему редактированию testuser.domain.com/index.php теперь отображается пользователь. php файл правильно. Однако, как и раньше, testuser.domain.com по-прежнему отображает файл index.php вместо user.php. файл. - person Yah; 11.08.2010
comment
@Yah - Хм, на моем тестовом сервере все работает нормально. У вас есть полный доступ к конфигурации сервера или нет? - person Tim Stone; 11.08.2010
comment
Привет, Тим. Нет, не совсем. Какие настройки, по вашему мнению, мне следует проверить/отрегулировать? Наилучшие пожелания - person Yah; 11.08.2010
comment
@Yah - Ну, я собирался порекомендовать использовать RewriteLog чтобы проверить, что совпало, а что было, но вы должны определить это в конфигурации вашего виртуального сервера. Я пытаюсь придумать альтернативный способ увидеть, чем процесс в вашей среде отличается от моего, так как я уверен, что это легко исправить... как только мы все равно обнаружим проблему. - person Tim Stone; 11.08.2010
comment
Поскольку я не могу изменить конфигурацию Apache, я изменил RewriteRule [NC, QSA, L] на [R], чтобы узнать, куда он ведет меня, когда я ввожу URL-адрес. Кажется, это подтверждает, что ничего не перенаправляется, когда я просто ввожу testuser.domain.com . Он перенаправляется в файл user.php только тогда, когда я добавляю к нему хотя бы одну переменную, например testuser.domain.com/helloworld (перенаправляет на user.php?id=testuser&var1=helloworld&var2=&var3=) - person Yah; 11.08.2010
comment
Да, одно из условий должно быть по какой-то причине не выполнено. Что произойдет, если вы удалите RewriteCond %{REQUEST_FILENAME} !-d? - person Tim Stone; 11.08.2010
comment
Странно, но это действительно решило проблему. :) Большое спасибо, Тим. Наилучшие пожелания - person Yah; 11.08.2010