PHP: разрешение отклонено, несмотря на соответствующие разрешения

Я пытаюсь прочитать файл в PHP, и я получаю отказ от разрешения, хотя у каждого есть доступ к файлу.

Код PHP:

$config=file_get_contents('/opt/jenkins/home/config.xml'); 

Ошибка:

 Warning: file_get_contents(/opt/jenkins/home/config.xml): failed to open stream: Permission denied in [...] 

Разрешение файловой системы:

Существует символическая ссылка /opt/jenkins/home/ to /var/lib/jenkins и у всех есть разрешение на чтение символической ссылки, фактической папки и файла.

 $ ls -lh /opt/jenkins/ lrwxrwxrwx 1 sysadmin sysadmin 16 2011-08-04 08:12 home -> /var/lib/jenkins $ ls -lh /var/lib/ | grep jenkins drwxr-xr-- 6 jenkins adm 4.0K 2011-08-04 10:04 jenkins $ ls -lh /var/lib/jenkins/config.xml -rwxr-xr-- 1 jenkins adm 3.9K 2011-08-04 10:05 /var/lib/jenkins/config.xml 

Конфигурация Apache

Настроено для символических ссылок folllow ( Options All ). Добавление директивы Directory для /var/lib/jenkins/ не имеет значения.

 <Directory /opt/jenkins/home/> Options All AllowOverride All Order Allow,Deny Allow from All </Directory> 

Дополнительная информация

Я использую путь через "/opt/jenkins/home/config.xml" ( "/opt/jenkins/home/config.xml" ) или реальный путь ( "/var/lib/jenkins/config.xml" ). У меня та же проблема.

 apache2 version=2.2.14-5ubuntu8.4 php version=5.3.2-1ubuntu4.9 

Любая идея о том, почему я получаю сообщение об ошибке?

Для работы этого каталога вам необходимо execute разрешение на execute . Кажется, что мир не выполняется, и поскольку jenkins , вероятно, не является пользователем apache, а пользователь apache не входит в группу adm , это не сработает:

 $ ls -lh /var/lib/ | grep jenkins drwxr-xr-- 6 jenkins adm 4.0K 2011-08-04 10:04 jenkins 

Например:

 netcoder@netcoder:~$ mkdir foo netcoder@netcoder:~$ echo hello > foo/bar netcoder@netcoder:~$ chmod 777 foo/bar netcoder@netcoder:~$ ls -lsah foo/bar 4.0K -rwxrwxrwx 1 netcoder netcoder 6 2011-08-04 08:22 foo/bar netcoder@netcoder:~$ chmod 444 foo/ netcoder@netcoder:~$ ls -lsah | grep foo 4.0K dr--r--r-- 2 netcoder netcoder 4.0K 2011-08-04 08:22 foo netcoder@netcoder:~$ cat foo/bar cat: foo/bar: Permission denied 

Несмотря на то, что foo/bar имеет разрешение 0777 , если каталог не имеет разрешения на выполнение, чтение его содержимого отклоняется.

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

Вам нужно, чтобы бит выполнения был установлен во всех каталогах в иерархии до этого файла.

 chmod o+x /var/lib/jenkins 

должен сделать трюк.

(Примечание: ls -lhd /var/lib/jenkins немного лучше, чем ls -lh ...|grep jenkins )

Скорее всего, ваш пользователь Apache не может читать или получать доступ к веб-файлам

  1. Проверьте, что пользователь работает с apache:

     $ ps aux | grep [a]pache root 40283 0.0 0.2 472548 21116 ? Ss 14:38 0:00 /usr/sbin/apache2 -k start www-data 40287 0.0 0.1 472760 8800 ? S 14:38 0:00 /usr/sbin/apache2 -k start www-data 40288 0.0 0.1 472760 8540 ? S 14:38 0:00 /usr/sbin/apache2 -k start www-data 40289 0.0 0.1 472776 8540 ? S 14:38 0:00 /usr/sbin/apache2 -k start 
  2. Проверьте права собственности на свои веб-файлы:

     $ namei -mol /home/john/app2/ f: /home/john/app2/ drwxr-xr-x root root / drwxr-xr-x root root home drwx------ john john john # <== Ahaa, no access for apache user! drwxr-xr-x john john john app2 
  3. Отрегулируйте разрешения соответственно:

На этом этапе я оставлю это до вас , вы можете либо (a) сделать apache user 'john' в этом примере . Или вы можете (b) переместить веб-папку в место вне дома. Если доступ к выполнению может быть предоставлен группе или даже другим, не нарушая безопасные методы безопасности.

а. Сделайте apache user john (ТОЛЬКО ДЛЯ САЙТОВ DEV или если вы знаете, что делаете)

 sudo vi /etc/apache2/envars # replace export APACHE_RUN_USER=www-data export APACHE_RUN_GROUP=www-data # with export APACHE_RUN_USER=john export APACHE_RUN_GROUP=john 

б. Переместите эту папку вне дома … что она там делает?

 sudo mv /home/john/app2 /var/www/ 

Не забудьте изменить сайт для соответствия этому каталогу и перезапустить сервер Apache.

Вот несколько ссылок:

https://wiki.apache.org/httpd/13PermissionDenied

http://wiki.apache.org/httpd/FileSystemPermissions