RHEL + PHP: запись файлов вне / var / www / html? - PullRequest
3 голосов
/ 25 января 2012

Я пытаюсь открыть файл для чтения / записи.Я разрабатывал на Ubuntu, и у меня не было никаких проблем.Теперь пришло время для развертывания на сервере RHEL, и я обнаружил, что, похоже, есть какое-то ограничение на местоположение файла, который нужно записать.

На RHEL я не могу открыть файл, если он не находится в / var / www / html.Я не могу понять, как разрешить другие места.Мне нужно манипулировать файлами на другом томе по соображениям управления дисковым пространством.

Ниже приведен фрагмент кода, который прекрасно работает в Ubuntu, несмотря ни на что, но прерывается на RHEL, если файл находится за пределами корневого веб-каталога.:

$repometa = fopen( "/path/to/file/it/does/exist/and/has/good/perms", "r+b");

Фактическая ошибка выглядит следующим образом, что странно, потому что разрешения просто хороши (принадлежат пользователю «apache», с 0644 перми на файл, 755 на dirs).

fopen(<thefile>): failed to open stream: Permission denied

Может ли кто-нибудь указать мне на документы, описывающие, как разорвать конфигурацию Apache / PHP RHEL, чтобы разрешить запись в альтернативные места в файловой системе?

Спасибо, ~ Paul

Ответы [ 3 ]

3 голосов
/ 25 января 2012

Как написано на справочной странице httpd_selinux(8), вы должны предоставить файлам и каталогам определенный контекст файла, если вы хотите иметь возможность читать или записывать их. Подробности смотрите на странице man, помня, что PHP-скрипты запускаются как демон, если вы специально не настроили PHP для работы в качестве CGI.

3 голосов
/ 14 января 2013

Чтобы добавить некоторые детали к принятому ответу, у меня также была именно эта проблема, и эта команда исправила ее для меня.

chcon -R -t httpd_sys_content_t /path/to/file/it/does/exist/and/has/good/perms
1 голос
/ 25 января 2012

Похоже, проблема с правами пользователя и / или группы. Файл сам может быть доступен для записи ... (как вы упомянули в своем хорошем пути), но, возможно, пользователю apache (или как бы он ни назывался) не разрешено создавать какие-либо изменения файла за пределами каталога по умолчанию / var / www / html?

Любой способ внести изменения в файл в / var / www / html, а затем заставить другой сценарий оболочки (и / или пользователя) взять его оттуда и переместить в нужный каталог?

Интересно, что это будет работать на Ubuntu, а не на RHEL; может быть, RHEL более строг в отношении пользователей и групп?

В качестве отступления: в целом, может быть безопаснее не делать PHP-запись в файлы за пределами каталогов www ...:)

EDIT

По подсказке @ Ignacio (1), возможно, что-то подобное может сработать: http://us2.php.net/manual/en/function.fopen.php#56551

Если это то, что вам нужно постоянно, вы можете попробовать ввести это в командной строке:

/usr/sbin/setsebool -P httpd_can_network_connect=1

Я все еще был бы осторожен с манипуляциями с файлами PHP вне папки www ... но, надеюсь, это поможет ...!

(1) http://linux.die.net/man/8/httpd_selinux

...