Мне было интересно: возможно ли защитить каталог / файл на сервере от внешнего мира, но сделать его доступным для PHP?
Это довольно просто. Я кэширую веб-страницы на своем сервере с PHP в определенном каталоге, но я не хочу, чтобы веб-пользователи просматривали эти файлы или этот каталог напрямую. PHP, с другой стороны, должен иметь доступ к этим файлам (чтобы обслуживать их для пользователя). Это может показаться нелогичным, но то, что я пытаюсь сделать, – это ограничить пользователей определенными страницами и по-прежнему их кэшировать в удобном для веб-сервера формате.
Предпочтительно что-то с .htaccess или chmod.
Благодаря!
Абсолютно – на самом деле вам не нужно использовать .htaccess. Просто поместите защищенный каталог над корнем вашего документа (то есть сохраните его рядом с папкой, где хранятся ваши скрипты PHP, обычно «htdocs», «httpdocs» или иногда просто «www»).
Таким образом, ваши веб-файлы будут в папке /my/folders/httpdocs/
, а ваши «защищенные» файлы будут в папке /my/folders/protected_folder/
Идея здесь заключается в том, что PHP может обращаться к любой папке на сервере, но Apache не позволит пользователю перемещаться «над» корневым каталогом.
Чтобы получить доступ к каталогу, вы можете использовать:
$protected_path = $_SERVER['DOCUMENT_ROOT'].'/../protected_folder/';
(Кстати, вы упомянули, что делаете это для кеширования страниц – возможно, вам стоит взглянуть на Smarty , механизм шаблонов PHP, который предварительно компилирует ваши шаблоны, а также поддерживает действительно интеллектуальное кэширование. И на самом деле один из Smarty " передовые методы "- это настроить вашу структуру, чтобы файлы шаблонов и кешей не находились в папке document_root или ниже, поэтому пользователи, входящие в Apache, никогда не смогут добраться до них, но код Smarty PHP может легко получить все, что от него требуется.)
Конечно, просто поместите файлы в каталог за пределами вашего веб-корня. Например, если ваш веб-корень – это /usr/local/apache/htdocs/
вы можете создать каталог /usr/local/apache/htdocs/
которому должен иметь доступ PHP, но нет доступа к нему через веб-интерфейс запрос.
Вы также можете поместить файл .htaccess
состоящий из строки deny from all
в каталоге, который вы хотите защитить. Это не позволит Apache (но не PHP) обслуживать файлы.