Предоставление PHP разрешения на запись в Apache

Я относительно новичок в настройке Apache.

У меня есть PHP-скрипт, который записывает файл JSON на основе значений, полученных из $_GET.

<?php

    file_put_contents('State.json', "{ do: '" . $_GET['do'] . "' }");

    echo "Success";

?>

Я запускаю этот код, создавая запрос XHR.

Ally.xhr('/Cream/Foam?do=someCommand');

Страница, которую он возвращает, говорит failed to open stream: Permission denied on line 3.

<Directory "~/Dropbox/Web">
    Options Indexes FollowSymLinks MultiViews

    AllowOverride None

    Order allow,deny
    Allow from all
</Directory>

Это права доступа к корневой папке сервера.

Что мне нужно изменить, чтобы PHP мог записать файл?

(Я почти не знаю, что означает блок выше.)


person McKayla    schedule 18.03.2011    source источник
comment
Как насчет разрешений chmod для файла/каталога, в который он пишет?   -  person Kit    schedule 19.03.2011
comment
Не очень хорошая идея помещать веб-папку в корневую папку. Поместите его в /var/www/, как и другие файлы. Там у вас нет проблем с правами.   -  person René Höhle    schedule 19.03.2011
comment
..чмод? Я понятия не имею, что это такое. Может быть, это то, чего мне не хватает.   -  person McKayla    schedule 19.03.2011
comment
chmod — это функция POSIX для установки разрешений режима использования (ch-change mod-mode). Если вы используете FTP, вы можете увидеть, как это делается.   -  person Christian    schedule 19.03.2011


Ответы (5)


Вам нужно проверить, есть ли у пользователя, под которым работает apache, разрешение на запись в каталог.

Вот так:

Ваш сервер Apache находится в процессе. Процесс выполняется под каким-то пользователем (например, www). PHP работает под apache. Поэтому, если вы попытаетесь записать в каталог в PHP, это будет то же самое, как если бы пользователь www зашел на сервер и попытался создать файл в том же каталоге. Поэтому проверьте, кто является владельцем этого каталога и какое разрешение у него есть. Вы можете сделать это, например. с помощью команды ls -la. Если www будет владельцем этого каталога, вы будете на 100% в безопасности...

person Jan Zyka    schedule 18.03.2011
comment
Он работает под _www по умолчанию. Так что, если я даю разрешение, это должно работать? - person McKayla; 19.03.2011
comment
chown www-data:www-data ~/Dropbox/Web и chmod 777 ~/Dropbox/Web - person René Höhle; 19.03.2011
comment
Пожалуйста, не выполняйте chmod 777 на общедоступном веб-сервере. - person Alex W; 19.03.2014

Вы можете попробовать установить разрешения с помощью

chmod для php и установите каталог в /var/www там, где обычно достаточно разрешений.

person René Höhle    schedule 18.03.2011

Проверьте права доступа к файлу либо в командной строке, используя:

ls -l /path/filename

Или через ваш ftp-клиент, если у вас есть ftp-доступ к файлу/каталогу. Если нет, вы можете изменить местоположение, как сказал Стони выше.

person Kit    schedule 18.03.2011

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

Также проверьте, включен ли SELinux, проверив содержимое /selinux/enforce. Если это так, либо отключите его, либо убедитесь, что для пути, по которому вы пишете, установлены правильные метки.

person Scott Duckworth    schedule 18.03.2011

Знайте, что иногда нет абсолютно никакого способа обойти это, используя только PHP.

Два решения для этого:

  1. Настройте разрешения PHP и Apache вручную (предупреждение: может очень быстро загрязниться).
  2. Используйте FTP, чтобы изменить владельца на 0777 (полный доступ), а затем вернуться после внесения изменений.

Я часто обнаруживал, что последний вариант работает лучше всего.

person Christian    schedule 18.03.2011