Этот вопрос был задан несколько раз здесь, но я еще не нашел решения. У меня есть Fedora 19 LAMP server, и я просто хочу запустить простую команду: file_put_contents('test.txt', 'Hello there');
чтобы подтвердить, что мой веб-сервер может использовать PHP для записи данных в файлы. У меня возникли проблемы с выяснением правильной схемы разрешений. Для начала, только для разработки, корнем документа Apache является /var/www/html
. Этот каталог изначально принадлежал пользователю и группе с именем www-data
, но я сменил группу каталога на основную группу владельца процесса httpd с именем apache
. Именно этот владелец активен при запуске PHP. Я подтвердил это следующим:
Как вы видите, владельцем процесса является apache
, текущим директором является /var/www/html/php-console
. Каталог принадлежит www-data
и члены группы apache
имеют полный доступ к нему.
Я попробовал следующее, чтобы заставить PHP фактически создать файл в этом месте, но безрезультатно:
chmod 777 /var/www/html/php-console chown apache /var/www/html/php-console chgrp apache /var/www/html/php-console cd /var/www/html; > test.txt; chmod 777 test.txt;
Ничего не будет работать, пока этот скрипт запускается из браузера. Однако, когда я использую file_put_contents
с PHP CLI, он работает так же, как я ожидал, при условии, что пользователь, который я вводил команды как или его группа, имеет права на запись в этот каталог или тестовый файл.
Итак, из командной строки вы видите, как www-data
имеют права на чтение, запись и выполнение в папку, в которой я находится. posix_getpwuid
и posix_geteuid
помогают вам найти владельца процесса Apache / PHP, который в этом случае так же, как пользователь зашел в консоль. file_put_contents
записывает 8 байтов в указанный файл. Если я изменю группу или владельца и группу на что-то другое, я получаю отказ от прав, что абсолютно имеет смысл.
Если это работает в командной строке, то почему нет, когда я действительно хочу это, т. Е. Пока на самом деле обслуживает веб-страницы ???
Поскольку вы забыли прочитать httpd_selinux(8)
страницу httpd_selinux(8)
и предоставить каталогу соответствующий контекст файла, чтобы веб-сервер мог там писать файлы.