Я столкнулся с проблемой на клиентском сайте в течение последних нескольких недель, когда они не могут загружать файлы в каталог за пределами корневого веб-сайта.
После просмотра журналов ошибок кажется, что PHP выдает ошибки, говоря, что каталог загрузки недоступен для записи. Этот каталог находится за пределами корневого веб-каталога, но нет open_basedir
ограничения на сервере.
У меня есть тестовый скрипт, который выполняет следующий код:
$path = '/var/www/vhosts/testdir';
$writable = is_writable($path) ? 'is writable' : 'is not writable';
echo "$path $writable";
Когда я запускаю сценарий из командной строки с php test.php
каталог доступен для записи. Однако когда я открываю страницу из браузера, она недоступна для записи.
И корневой веб-каталог, и testdir
принадлежат к одному пользователю и группе и имеют 755
разрешения установлены. Я пытался установить владельца обоих каталогов на apache
но безрезультатно.
Когда я устанавливаю разрешения для каталога загрузки на 777
это работает, но, очевидно, я не хочу, чтобы все мои файлы были доступны для чтения и выполнения всем.
Дистрибутив - CentOS 6.7.
Я упустил что-то очевидное?
Пользователь или группа, запускающая httpd, должны иметь доступ на запись. PHP наследует это от httpd.
Ваша проблема почти наверняка SELinux. Файлы и каталоги за пределами корневого веб-сайта вряд ли будут иметь правильный контекст SELinux, например. httpd_sys_content_t.
Вам нужно будет изменить контекст SELinux для файлов / каталогов, в которые вы хотите иметь возможность писать.