Я знаю, что это общая проблема, но я не смог выделить проблему для моего конкретного случая использования, так что терпите меня.
У меня есть простой скрипт 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 запускается на уровне root.
У кого-нибудь есть предложения? Если это поможет, это, кажется, произошло после yum update
Я решил эту проблему, просто запустив chcon -Rt httpd_sys_content_rw_t
в каталоге, где жил мой проблемный PHP-скрипт.
Дополнительное примечание
ls -alZ *
Ключ -Z будет работать с большинством утилит, чтобы показать контексты безопасности SELinux
Попробуйте изменить владельца папки и файла на (chown
) к «www-data» или к «www-data: www-data» и посмотреть, что-то изменится …
Используйте относительный путь к файлу из «ROOT DOOUMENT ROOT» Apache для ссылки на файлы в PHP. Это разрешения Apache, которые имеют значение, и по соображениям безопасности он закодирован, чтобы запретить доступ к файлам вне DOCUMENT_ROOT .. (да, даже если ваш путь ведет в него, Apache блокируется, как только он видит, что путь начинается с «/ VAR». ,
Предполагая, что этот скрипт PHP находится в том же каталоге, что и файл id.txt, просто используйте
$file = file_put_contents('./id.txt', $str...
Или если текстовый файл был в подкаталоге
file_put_contents('./sub-dir/id.txt', $str...
Мало того, что это безопасно, это намного короче, чтобы напечатать также.