2010-08-11 2 views
1

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

Ввод:

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] 

ответ

2

Ваши правила на самом деле очень близки к тому, что вы хотите от них. Единственная проблема, которую я вижу, - это ваши тестовые шаблоны для ваших двух операторов 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] 
+0

Привет Тим, Спасибо за быстрый ответ. Я изменил файл htaccess, но, похоже, проблема может быть в другом месте. Кажется, что файл user.php отображается только при вводе переменной вместе с ним. Чтобы привести пример: http://www.domain.com/ -> (показывает index.php) http://domain.com/1/2/3/ -> (показывает индекс. php) http://testuser.domain.com/1/2/3/ -> (показывает user.php) Пока все хорошо, НО: http://testuser.domain.com/ - > (показывает index.php) У вас есть идея, как я могу сделать это так, что даже без каких-либо дополнительных переменных он всегда будет показывать user.php для поддомена? С наилучшими пожеланиями – Yah

+0

О, крики, один сценарий, который я не тестировал. Я сделаю редактирование, которое должно позаботиться об этом. –

+0

Привет Тим, Я скорректировал его снова, но он все еще не работает. Благодаря вашему последнему праву http://testuser.domain.com/index.php теперь корректно отображается файл user.php. Однако, как и раньше, http://testuser.domain.com/ по-прежнему отображает файл index.php вместо файла user.php. – Yah