В сайте, кот. я делаю, есть раздел "для всех", "личный кабинет" и "панель администратора" - соответственно, папки "/", "/account/" и "/admin/"; есть еще папка "/photo/". В .htaccess я хочу настроить так, чтобы при попытке зайти куда-либо кроме этих папок посетитель перенаправлялся в index.php одной из этих папок, либо в корневую /index.php. Написал так: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !^account|admin|photo RewriteRule ^(.*)$ index.php Options -Indexes Что не нравится: 1. При попытке по http зайти в /admin/mama.php (такого файла нет) посетителю отдается 404 вместо редиректа на /admin/index.php либо (хуже) /index.php 2. При попытке зайти в /mama/ (такая папка может быть и может не быть - неважно) посетителю отдается правильный контент из /index.php, но текущей папкой считается не / , а /mama/ и, соответственно, ломаются все относительные ссылки Как исправить?
0. Единая точка входа. 1. Не надо показывать, где находится вход в вашу админку. Наоборот его нужно тщательно спрятать. 2. Используйте абс. адресацию. --- Добавлено --- P.S. Корректировку адреса редиректом можно выполнять, но только для авторизованного админа.
1. Как прятать точку входа в админку? Придумать левое имя для раздела, например, www.site.com/fghjkghjk/ ?
Вариантов масса. Я обычно вообще не смешиваю морду сайта и админку. Например, админка может быть на непубличном (под)домене или на www-поддомене.
А в чем разница между http://admin.site.com (непубличный поддомен) и http://www.site.com/admin ? Почему первый вариант называется "спрятать админку в непубличный поддомен", а второй называется "не спрятанная админка"?
Непубличный (под)домен – это тот, которого нет на публичных DNS-серверах Например, можешь прописать его на локалке в файле hosts. Форму входа тоже можно держать на локалке.
А, ну да, торможу, сорри Нет, такой вариант, к сожалению, не подходит: я делаю систему аренды интернет-магазинов; админка - это админка конкретного арендованного кем-то интернет-магазина. А какой еще есть хороший способ спрятать админку магазина в этом случае?
Да, для SaaS нет смысла прятать админку продавцов. Хотя в общем-то можете сделать wildcard и выдавать админам поддомены с их логинами специально для админки. Но по сложности подбора это почти то же самое, что и просто логины к форме входа подбирать. --- Добавлено --- P.S. Но в SaaS еще должна быть админка «суперадмина» (ваша), которую имеет смысл закрывать спец. методами, о которых я писал выше.
OK, спасибо. А давайте вернемся теперь к исходному вопросу? Что неправильно в .htaccess - см.первое сообщение темы?
OK, есть единая точка входа - /index.php. На сервере присутствует папка /libs/ , в которую посетителям ходить не надо. Как закрыть от посетителей эту папку?
Что это за папка? Папке, «в которую посетителям ходить не надо», не место в паблик каталоге Но если это не подвластно вашему понимаю, см. выше. Или вот аналог для «основного» .htaccess, чтобы не создавать дополнительные: Код (Text): RewriteRule ^libs/ - [NC,F] --- Добавлено --- P.S. Конечно, если на фронте работает сервер, отдающий статик и т.п., то это правило не защитит такой статик и т.п.
Да, спасибо, почему-то не подумал о том, что у папки может быть отдельный .htaccess Но - по возможности - не хотелось бы плодить .htaccess'ы, мне кажется более концептуальным вариант написать один htaccess для всех. Итак, что неправильно в моем .htaccess'е? Что такое папка libs? Ну, очевидно, какие-то PHP-библиотеки, используемые PHP-кодом сайта. Какие именно - имхо неважно в контексте обсуждения. Мне кажется, мой вариант - "запретить все кроме account|admin|photo" - предпочтительнее Вашего, где требуется перечислять все, что нужно запретить. Итак, что неправильно в моем .htaccess'е?
Мой вариант был тот, который вы успешно проморгали: И не мешайте мух с котлетами, а именно местоположение либ с адресами. По вашему .htaccess я ответил в самом начале. Если не понятно, скажу конкретнее: там лишнее как раз то условие, которое вам показалось предпочтительнее моего правила, написанного совсем по др. поводу --- Добавлено --- P.S. Под паблик каталогом я подразумеваю целиком ветку корневого каталога сайта. Если разместить либы в др. ветке, то их вообще специально закрывать не надо --- Добавлено --- P.P.S. Почитайте концовку этой статьи.
Не прокатит вообще ни как. Apache запускаются от www-data, и юзер смотрит страницы от www-data. Закроешь доступ к папке, скрипты работать не будут. Почему нельзя index.php в паблик кинуть, а все остальное за rootdirectory? Это единственны годный вариант. По поводу htaccess, либо модуль не включён в апаче, либо у апача нет на это прав(прописаны в apache.conf)