Я установил httpd и php на свежий centos7 и поместил несколько файлов в / var / www / html, включая написанный мной сценарий установки. Этот сценарий необходимо записать в файл конфигурации в каталоге / var / www / html. Я создал пустой файл конфигурации и подключил его к apache: apache. Однако попытка открыть этот файл с доступом для записи всегда дает ошибку:
fopen (/var/www/html/config-local.php): не удалось открыть поток: отказано в разрешении
Проводя исследование, я прочитал эту цитату: «для доступа к файлу ВСЕ родительские каталоги должны быть доступны для чтения». Я проверил, и они есть. /, / var, / var / www и / var / www / html доступны для чтения всем.
Так что здесь происходит? Похоже, что пользователь apache является своего рода пользователем с особыми ограничениями, поскольку тестирование того же сценария со стандартным пользователем работает нормально.
Вероятно, проблема с разрешениями SELinux. /var/log/audit/audit.log
должен иметь возможность подтвердить.
Контекст SELinux, вероятно, system_u: object_r: httpd_sys_content_t: s0
, но должен быть system_u : object_r: httpd_sys_rw_content_t: s0
. Это можно изменить с помощью chcon
.
Я также не оптимистичен по поводу наличия файла конфигурации в DocumentRoot
вашего веб-сервера. Я могу ошибаться, поскольку вы не предоставили достаточно деталей, но это будет так, если вы не изменили значения по умолчанию.
Потратил много времени на поиск этого ответа, но он весь разбит на кусочки, и никто не публикует решение (ну, в большинстве случаев), поэтому вот мое решение, и оно также используется в различных веб-панелях управления.
Установить и использовать MOD_RUID2
Установить PHP с помощью интерфейса командной строки (это стандартно для более новых версий)
В вашем файле HTTPD.CONF на виртуальных хостах вы добавите следующее, заменив имя пользователя на имя пользователя для входа , и usergroup с группой пользователя (обычно это одно и то же)
<IfModule !mod_ruid2.c>
SuexecUserGroup username usergroup
</IfModule>
<IfModule mod_ruid2.c>
RMode config
RUidGid username usergroup
RGroups @none
</IfModule>
Пример конфигурации виртуального хоста:
<VirtualHost *:443>
DocumentRoot "/home/imtheuser/public_html"
ServerName imtheuser.com
<IfModule !mod_ruid2.c>
SuexecUserGroup imtheuser imtheuser
</IfModule>
<IfModule mod_ruid2.c>
RMode config
RUidGid imtheuser imtheuser
RGroups @none
</IfModule>
<Directory "/home/imtheuser/public_html">
allow from all
Options None
Require all granted
</Directory>
</VirtualHost>
Это позволит apache/php записывать в каталог, принадлежащий пользователю. Это намного безопаснее, чем установить для вашего chmod значение 0777.