Mod_rewrite невидимо: работает, когда целью является файл, а не каталог

У меня есть правило перезаписи, которое превращает foo.com/test (или foo.com/test/) в foo.com/test.txt:

RewriteRule ^test/?$ test.txt [NC,L]

Он отлично работает и, что важно, никогда не показывает пользователю, что «настоящим» URL-адресом является foo.com/test.txt.

Теперь я хочу сделать то же самое, если «настоящий» URL — это foo.com/testdir, где testdir — это каталог:

RewriteRule ^test2/?$ testdir [NC,L]

Он выполняет перезапись, но показывает эту перезапись пользователю. Не то, что я хочу.

Может ли кто-нибудь объяснить, о чем здесь думает Apache, и лучшее решение? Простое переписывание в testdir/index.php у меня не работает, так как код в index.php не имеет правильного рабочего каталога. (Он работает так, как если бы это был foo.com/index.php, а файлы css и еще много чего находятся в foo.com/testdir/.) Возможно, правильным решением будет изменить содержимое index.php, чтобы оно ссылалось на testdir/foo. css вместо просто foo.css, но мне лень. Кроме того, я бы предпочел, чтобы правило перезаписи не должно было знать, является ли оно index.php или index.html или чем-то еще.

Приложение

Благодаря первому ответу я теперь вижу суть своей проблемы: если я хочу, чтобы пользователь использовал URL-адрес me.com/foo и переходил к «настоящему» URL-адресу me.com/somedir, мне нужно выбирать между двумя нежелательными вещи:

  1. URL-адрес явно переписывается (пользователь может видеть me.com/somedir).
  2. Материал в somedir работает так, как будто он находится в корневом каталоге. Поэтому я должен изменить все пути, например, в somedir/index.php. Например, «somedir/style.css» вместо «style.css», как я использовал при переходе прямо к «настоящему» URL-адресу, me.com/somedir.

Я думаю, что единственный ответ на это — смириться и изменить эти пути. Или просто переименуйте каталог «somedir» в «foo», но я не могу этого сделать по другим причинам.


person dreeves    schedule 06.11.2009    source источник


Ответы (1)


Добавьте косую черту в конце:

RewriteRule ^test2/?$ testdir/ [NC,L]

http://foo.com/testdir не является допустимым URL-адресом каталога, Apache ищет файл называется testdir, и поскольку testdir на самом деле является каталогом, Apache пытается исправить это, перенаправляя на testdir/ . Таким образом, пока ваша переписывание работало, последующая ошибка отсутствия косой черты была исправлена ​​путем перенаправления в testdir/.

Вам также может понадобиться добавить базовый тег href в заголовок вашего документа, иначе относительные ссылки не будут работать:

<base href="/">
person Rob    schedule 06.11.2009
comment
Это не имеет никакого эффекта для меня. Я понимаю, что вы имеете в виду под косой чертой, и было бы неплохо добавить ее, но, похоже, это не решает проблему, с которой я столкнулся. - person dreeves; 06.11.2009
comment
Я только что проверил это с Apache 2.2, и он работал нормально... убедитесь, что вы очистили кеш. - person Rob; 06.11.2009
comment
Ознакомьтесь с дополнением, которое я только что добавил к вопросу. Добавление косой черты заставляет переписать работу, но тогда вам нужно изменить все пути внутри testdir. Возможно, просто нет никакого способа обойти это. Большое спасибо за этот ответ, кстати. - person dreeves; 07.11.2009
comment
О, хорошо, я понимаю, если вы используете относительные ссылки, вы можете использовать тег ‹base href=/› в заголовке и просто сделать все свои ссылки относительными к корню документа. - person Rob; 07.11.2009
comment
Ах, базовый тег в заголовке — отличная идея. Хотите добавить это к своему ответу, и я отмечу его как принятый ответ? - person dreeves; 08.11.2009
comment
Нет проблем, добавлено в ответ. - person Rob; 11.11.2009