Используйте 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>