У меня есть правило перезаписи, которое превращает 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, мне нужно выбирать между двумя нежелательными вещи:
- URL-адрес явно переписывается (пользователь может видеть me.com/somedir).
- Материал в somedir работает так, как будто он находится в корневом каталоге. Поэтому я должен изменить все пути, например, в somedir/index.php. Например, «somedir/style.css» вместо «style.css», как я использовал при переходе прямо к «настоящему» URL-адресу, me.com/somedir.
Я думаю, что единственный ответ на это — смириться и изменить эти пути. Или просто переименуйте каталог «somedir» в «foo», но я не могу этого сделать по другим причинам.