Используйте htaccess, чтобы замаскировать имя папки

Вот проблема, которую я всегда хочу решить с помощью htaccess. Я еще не нашел способ, хотя, похоже, это возможно - возможно, кто-то может помочь.

Допустим, у меня есть папка в корне моего сайта под названием /foo/, Я хочу, чтобы пользователи могли получить доступ к этой папке по пути /bar/, но по разным причинам я не могу переименовать папку.

Чтобы не создавать путаницу, я хочу, чтобы когда-либо был виден только один путь, то есть я не хочу, чтобы люди использовали имя /foo/ получить доступ к папке; они должны всегда использовать /bar/, Если кто-то идет в example.com/foo/их браузер должен перенаправить на example.com/bar/ - но возвращаемое содержимое должно быть содержимым /foo/,

Чтобы сделать вещи более сложными, страницы в /foo/ иметь зависимости (изображения, таблицы стилей, ссылки на другие страницы и т. д.) в пределах /foo/ которые жестко закодированы и не могут быть изменены. Это должно, конечно, все еще работать.

Итак, подведу итог, вот что я хочу:

  • Запросы для example.com/foo/ следует перенаправить на example.com/bar/,
  • Запросы для example.com/bar/ должен вернуть содержимое example.com/foo/,

Это возможно? На первый взгляд это выглядит так, как если бы оно создавало бесконечное перенаправление... но я вполне уверен, что есть способы предотвратить это в htaccess, не так ли?

Я был бы очень благодарен за любую помощь.

(PS - для небольшого дополнительного фона: нормальная причина, которую я хочу сделать, это переименовать WordPress /wp-admin/ каталог на что-то более профессиональное и легкое для запоминания, например /admin/, Но та же самая система должна работать для маскировки любого пути таким образом.)

2 ответа

Решение

Я нашел своего рода обходной путь - используя символическую ссылку и htaccess в комбинации.

Сначала я создал символическую ссылку из /bar в /foo/,
Затем я положил это в htaccess:

Options +FollowSymLinks
RewriteRule ^foo/(.*)$ bar/$1 [R,L]

Это имеет точно желаемый результат - example.com/bar/ показывает содержание /foo/ каталог и example.com/foo/ перенаправляет на example.com/bar/

Но если кто-то может предложить чистое решение htaccess, я бы предпочел это!


Обновить:

Хорошо, я наконец узнал, как это сделать. Оказывается, все довольно просто...

RewriteCond %{THE_REQUEST} ^GET\ /foo/
RewriteRule ^foo/(.*)$ bar/$1 [R,L]

RewriteRule ^bar/(.*)$ foo/$1

Единственная проблема заключается в том, что он не учитывает RewriteBase, поэтому вы должны включить полный путь в первую строку (после ^GET\).

Если я правильно понимаю, что вы хотите, что-то вроде этого в вашем файле.htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^foo/$ bar/
RewriteRule ^bar/$ foo/
</IfModule>
Другие вопросы по тегам