Файл, открытый с помощью fopen ($ file, 'w'), недоступен для записи - PullRequest
2 голосов
/ 11 января 2020

Загрузка текстового файла в форму с помощью fopen ($ file, 'w') , но файл недоступен для записи и изменения не могут быть сохранены. Очевидно, проблема с разрешениями, но я не хочу менять их на 777 по очевидным причинам безопасности. Есть ли способ сделать это на лету, а затем изменить его после сохранения?

<?php $file = "$ServerRoot/text/test.txt";
// $ServerRoot is defined elsewhere and is to the root of the filesystem

// Retrieve the submitted changes and save to the file
if ($_SERVER['REQUEST_METHOD'] === "POST") :
    $fh = fopen($file, 'w') or die("Can't open file for writing.");
    fwrite($fh, $_POST['textfield']);
    fclose($fh);
    echo "Content saved.";
endif;

// FOR DIAGNOSTIC PURPOSES ONLY
$TestFile = (file_exists($file)) ? "The file exists\n" : "The file does <font color=\"red\">NOT</font> exist\n";
$TestFile .= (is_readable($file)) ? "The file is readable\n" : "The file is <font color=\"red\">NOT</font> readable\n";
$TestFile .= (is_writable($file)) ? "The file is writable\n" : "The file is <font color=\"red\">NOT</font> writable\n";
$TestFile = nl2br($TestFile);

// Read the textfile
$text = file_get_contents($file);?>

<div align="center">
<?=$TestFile;?>
    <form action="<?=$submitFormAction;?>" method="post">
        <div><input type="submit" value="Save File" />
        <input type="reset" value="Reset"/></div>
        <div><textarea name="textfield" rows="25" cols="85"><?=htmlspecialchars($text);?></textarea></div>
        <div><input type="submit" value="Save File" />
        <input type="reset" value="Reset"/></div>
    </form>
</div>

1 Ответ

1 голос
/ 11 января 2020

Никогда не chmod файлы 777. Даже временно. Это угроза безопасности, и ее не нужно устанавливать на сервере, который был правильно настроен.

Если PHP не может выполнить запись в файл, это означает, что веб-сервер не является владельцем файла или вы ' мы как-то отменили права на запись у владельца как root / администратор. Проверьте владельца файла в вопросе. Если вы используете Apache в качестве веб-сервера, владельцем, вероятно, должно быть что-то вроде www-data. Если это неправильный владелец, обязательно исправьте эту проблему, сменив владельца.

Имейте в виду, что если вы настроили apache для обслуживания нескольких доменов, владельцы могут быть совершенно другими , например client1, client2 et c.

После того, как вы убедились, что установлен правильный владелец, достаточно изменить chmod для файла на 755.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...