Подстановочный знак apache mod_rewrite

Я пытаюсь написать mod_rewrite, чтобы он работал так

  • domain.com => index.php
  • anything.anotherdomain.com => index.php/anything
  • foo.blabla.com => index.php/foo
  • wildcard.maybeanother.com/bar/bla => index.php/wildcard/bar/bla

Вот конфиг, который у меня есть, но апач просто выдает ошибку 500.

<IfModule mod_rewrite.c>
    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{HTTP_HOST} ^*\.*
    RewriteRule ^(*\.*)$ index.php/$1/$2 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php/$1 [L]

</IfModule>

Кто-нибудь понял, что с этим не так? :-)

Заранее спасибо!


person tarnfeld    schedule 22.04.2011    source источник
comment
Является ли index.php папкой? Кажется странным, что у вас есть index.php/something/something   -  person Compeek    schedule 23.04.2011
comment
ну вроде как ответы на этот вопрос (stackoverflow.com/questions/5127011/apache-mod-rewrite) работает нормально, но я не хотел полагаться на конкретные dev.domain.com или api.domain.com   -  person tarnfeld    schedule 23.04.2011


Ответы (1)


Попробуйте это:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+\.[^.]+$
RewriteRule ^$ index.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+\.[^.]+$
RewriteRule ^(.*)$ index.php/$1 [L]  

RewriteCond %{HTTP_HOST} ^([^.]+)\.[^.]+\.[^.]+\.[^.]+$
RewriteRule ^$ index.php/%1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^([^.]+)\.[^.]+\.[^.]+\.[^.]+$
RewriteRule ^(.*)$ index.php/%1/$1 [L]
person Compeek    schedule 22.04.2011
comment
Я надеялся, что это не будет domain.com конкретным? Добавлю это к моему вопросу :) - person tarnfeld; 23.04.2011
comment
Это работает? Кроме того, я сделал еще несколько небольших изменений, чтобы сделать правила более конкретными. - person Compeek; 23.04.2011
comment
Нет :( Также, глядя на это, я не думаю, что это будет делать то, что я хочу. Я хочу, чтобы запрос api.domain.com/path нажал API на index.php/api/path, где api на самом деле является первым битом в домене - если это имеет смысл? :) - person tarnfeld; 23.04.2011
comment
Вот для чего нужен %1. Он получает поддомен из RewriteCond. Вы все еще получаете ошибку 500? Это может быть бесконечный цикл перенаправления, но это всегда сложно, и я никогда не знаю, проблема в этом или нет. - person Compeek; 23.04.2011
comment
Больше нет 500, но только корень домена идет в файл index.php, и он не учитывает бит api, и если вы поставите что-нибудь в конце, он покажет 404 - как api.domain.com/something, но domain.com/something работает - person tarnfeld; 23.04.2011
comment
Вы уверены, что ваш поддомен настроен так, чтобы он указывал на ту же папку на сервере, что и основной домен? - person Compeek; 23.04.2011
comment
Да, потому что, если я просто захожу на api.domain.com, отображается то же, что и на domain.com. - person tarnfeld; 23.04.2011
comment
Ладно, думаю, у меня это работает [почти идеально]. Смотрите мой отредактированный ответ. Единственная проблема, с которой я столкнулся, заключается в том, что он будет выдавать ошибку 500 вместо 404, если файл по пути, на который он перезаписывается, не существует. Однако я не думаю, что это будет проблемой, поскольку ваша проблема с фреймворком обрабатывает ошибки 404, поэтому посмотрите, что произойдет. - person Compeek; 23.04.2011
comment
Это все еще не соответствует :( Хм, домен, на котором я это тестирую, состоит из 4 частей, api.domain.second.local - может быть, это может быть причиной? - person tarnfeld; 23.04.2011
comment
Вот почему. :p Я снова обновил ответ. Попробуйте еще раз. - person Compeek; 23.04.2011