Почему realpath() работает только с определенными папками?

Я использую PHP realpath() функция, и хочу знать, почему я получаю следующий вывод:

bool(false)
string(48) "/var/www/vhosts/website.co.uk/httpdocs"
bool(false)
string(48) "/var/www/vhosts/website.co.uk/httpdocs"

при запуске этого скрипта:

<?php
error_reporting(-1);
header('content-type: text/plain');

var_dump(realpath('/var/www/vhosts/website.co.uk/application'));
var_dump(realpath('/var/www/vhosts/website.co.uk/httpdocs'));
var_dump(realpath(dirname(__FILE__) . '/../application'));
var_dump(realpath(dirname(__FILE__) . '/../httpdocs'));

exit;

с этими правами доступа к файлам:

drwxr-x---  5 username  psaserv 4096 Jul 16 08:22 application
drwxr-x--- 10 username  psaserv 4096 Jul 16 13:34 httpdocs

Замечания:

  • Это система Plesk
  • Скрипт работает как apache пользователь
  • apache пользователь является частью psaserv группа

1 ответ

Решение

Ограничения Plesk и openbase_dir

Если plesk не изменился за последние несколько лет - он устанавливает ограничения open_basedir, так что вы можете получить доступ только к httpdocs папка:

Настройки open_basedir по умолчанию дают вам возможность писать в 2 местоположения для каждого сайта. Там не должно быть никаких оснований для записи в любую другую папку. [...]

  • / TMP
  • /var/www/vhosts/domain.com/httpdocs

Таким образом, если запрос пытается прочитать / записать в любом другом месте - он не сможет это сделать, следовательно, realpath вернет false для любого места за пределами httpdocs папка.


Если вы хотите увидеть скрипт, на который есть ссылка в ссылочном сообщении на форуме, его можно переместить и найти здесь: unplesk.

Другие вопросы по тегам