Переписать мод htaccess - как создать виртуальный поддомен? - PullRequest
1 голос
/ 11 августа 2010

Я хотел бы создать виртуальные субдомены через 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]

1 Ответ

2 голосов
/ 11 августа 2010

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

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

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

RewriteRule ^(.*)$

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

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

Edit : я также изменил набор 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]
...