Поддомены domain.site.ru -> site.ru/domain, зацикливается htaccess

_
На сайте с 30.11.2006
Offline
18
759

Здравствуйте! Помогите пожалуйста разобраться с проблемой:

Пытаюсь сделать wildcard-поддомены (в соответствии с http://www.easymodrewrite.com/example-subdomains).

DNS настроили, затем VirtualHost:

<VirtualHost *:80>

DocumentRoot "/home/user/www"

ServerName site.ru

ServerAlias www.site.ru site.ru *.site.ru

LogLevel debug

ErrorLog /home/user/log/error.log

</VirtualHost>

И .htaccess:

ErrorDocument 404 /404.html

DirectoryIndex index.php

Options +Indexes

Options +FollowSymLinks

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} !www.site.ru$ [NC]

RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9_-]+).site.ru [NC]

RewriteRule (.*) %2/$1 [L]

По идее, поддомены domain.site.ru должны реврайтиться в папки вида site.ru/domain/

Суть проблемы в том, что если папка существует, то все ОК. А если ее нет - должна ведь выдаваться ошибка 404? Но вместо этого выдается 500 Internal Server Error.

Лог ошибок:

[Fri May 08 17:09:23 2009] [error] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

[Fri May 08 17:09:23 2009] [debug] core.c(3046): r->uri = /ggg/ggg/ggg/ggg/ggg/ggg/ggg/ggg/ggg/ggg/

[Fri May 08 17:09:23 2009] [debug] core.c(3052): redirected from r->uri = /ggg/ggg/ggg/ggg/ggg/ggg/ggg/ggg/ggg/

[Fri May 08 17:09:23 2009] [debug] core.c(3052): redirected from r->uri = /ggg/ggg/ggg/ggg/ggg/ggg/ggg/ggg/

[Fri May 08 17:09:23 2009] [debug] core.c(3052): redirected from r->uri = /ggg/ggg/ggg/ggg/ggg/ggg/ggg/

[Fri May 08 17:09:23 2009] [debug] core.c(3052): redirected from r->uri = /ggg/ggg/ggg/ggg/ggg/ggg/

[Fri May 08 17:09:23 2009] [debug] core.c(3052): redirected from r->uri = /ggg/ggg/ggg/ggg/ggg/

[Fri May 08 17:09:23 2009] [debug] core.c(3052): redirected from r->uri = /ggg/ggg/ggg/ggg/

[Fri May 08 17:09:23 2009] [debug] core.c(3052): redirected from r->uri = /ggg/ggg/ggg/

[Fri May 08 17:09:23 2009] [debug] core.c(3052): redirected from r->uri = /ggg/ggg/

[Fri May 08 17:09:23 2009] [debug] core.c(3052): redirected from r->uri = /ggg/

[Fri May 08 17:09:23 2009] [debug] core.c(3052): redirected from r->uri = /

Я так понимаю, ggg.site.ru переписывается в site.ru/ggg, эту папку апач найти не может и начинает обработку реврайта по новой? Почему так? И как сделать, чтобы не найдя ее, сервер просто выдал 404?

wdsg
На сайте с 09.02.2009
Offline
31
#1

Попробуйте сделать примерно вот так:

RewriteCond %{HTTP_HOST} ^(.+)\.site\.ru$ [NC]

RewriteCond %{HTTP_HOST} !^www\.site\.ru$ [NC]
RewriteRule ^(.*)\.site\.ru(.*) /$1$2 [L]
Проектирование и разработка сложных IT-систем. Вожусь с проблемными задачами.
_
На сайте с 30.11.2006
Offline
18
#2

Это правило не срабатывает, независимо от имени поддомена.

Pattern в RewriteRule сравнивается с текущим URL, а в нем нет доменного имени.

malls
На сайте с 08.08.2005
Offline
255
#3

В Вашем случае, по идее вот так должно быть:


RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\.site\.ru$
RewriteCond %{HTTP_HOST} (www\.)?(.*)\.site\.ru$
RewriteRule ^(.*)$ /%2/$1

Еще посмотрите вот тут: "Виртуальные" поддомены я там с похожей проблемой "сражался"

_
На сайте с 30.11.2006
Offline
18
#4

Не работает, к сожалению. По-прежнему для несуществующих поддоменов (папок) выдает 500 Internal Server Error.

_
На сайте с 30.11.2006
Offline
18
#5

Разобрался. Я ошибочно полагался на L флаг, думая, что он в любой ситуации останавливает процесс mod_rewrite. Это не так. Если при обработке RewriteRule изменился URL, то по окончании разбора всех правил "создается" новый URL-запрос и обработка происходит заново.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий