Вопрос:
Я знаю, что это распространенная проблема, но я не смог выделить проблему для моего конкретного случая использования, так что несите меня.
У меня есть простой PHP-скрипт send_id который просто отправляет идентификационный номер и сохраняет его в TXT файл на моем сервере RHEL с Apache 2.4.6 с PHP 5.4.
Сообщение об ошибке: Warning: file_put_contents(/var/www/html/id.txt): failed to open stream: Permission denied in/var/www/html/send_id.php on line 6 ‘1’ written to server
Сам скрипт PHP:
<?php $id=$_GET[‘id’]; $stringData = «$id»; $file = file_put_contents(‘/var/www/html/id.txt’, $stringData.PHP_EOL , FILE_APPEND |LOCK_EX); echo «‘$stringData’ written to server»; ?>
chmodding до 777 ничего не делал. Кроме того, я проверил, чтобы увидеть права собственности и заметил, что файл id.txt принадлежит пользователю root на уровне пользователя/группы, а PHP запускается на корневом уровне.
У кого-нибудь есть предложения? Если это поможет, похоже, это произошло после yum update
Лучший ответ:
Я решил эту проблему, просто запустив chcon -Rt httpd_sys_content_rw_t в каталоге, где жил мой проблемный PHP-скрипт.
Дополнительное примечание
ls -alZ *
Коммутатор -Z будет работать с большинством утилит, чтобы показать контексты безопасности SELinux
Ответ №1
Попробуйте изменить владельца папки и файла на (chown) на “www-data” или на “www-data: www-data” и посмотреть, не изменит ли он что-нибудь…
Ответ №2
Используйте относительный путь к файлу из Apache “ДОКУМЕНТНЫЙ КОРТ” для ссылки на файлы в PHP. Это разрешения Apache, которые имеют значение, и по соображениям безопасности он закодирован для запрета доступа к файлам вне DOCUMENT_ROOT.. (да, хотя ваш путь ведет к нему, Apache блокируется, как только он видит, что путь начинается с “/VAR”.,
Предполагая, что этот PHP-скрипт находится в том же каталоге, что и файл id.txt, просто используйте
$file = file_put_contents(‘./id.txt’, $str…
Или если файл txt находился в подкаталоге
file_put_contents(‘./sub-dir/id.txt’, $str…
Это не только безопасно, но и намного короче.