为什么PHP不会在启用SELinux的情况下遵循符号链接?

时间:2014-04-29 10:34:09

标签: php centos symlink selinux

我有一个使用推进的网站。我想将各种配置文件放在Web根目录之外,但是在同一目录中需要它们(例如schema.xmlbuild.properties等)。因此,我决定从Web根目录添加符号链接到这些目录:

somesite.com/
  |
  |- public/
  |  |- index.php
  |  |- build -> ../private/build
  |  |- vendor -> ../private/vendor
  |
  |- private/
  |  |- build.properties
  |  |- schema.xml
  |  |- build/
  |  |- vendor/

我的包含路径因此设置:

set_include_path('vendor/propel/propel1/runtime/lib' . PATH_SEPARATOR . 'build/classes' . PATH_SEPARATOR . get_include_path());

然而,当我尝试require_once 'Propel.php';时,我收到以下错误:

Warning: require_once(Propel.php): failed to open stream: No such file or directory in /home/staging/apache/somewebsite.co.uk/public/functions.php on line 5

使用chdir('vendor/propel/propel1/runtime/lib');进行检查我收到以下错误:

Warning: chdir(): Permission denied (errno 13) in /home/staging/apache/somewebsite.co.uk/public/functions.php on line 5

因此,似乎PHP / Apache不会遵循符号链接。我尝试过以下方法:

  • 检查目录是否为o+x,以便apache可以读取它
  • 在apache配置中的目录指令中添加了Options FollowSymLinks(尽管在文档中它说这是默认设置)
  • 我还尝试chcon -R -h -t httpd_sys_content_t public/vendor/来更改SELinux类型但由于某种原因它没有改变

更新

我以apache用户(su -s /bin/bash apache)身份登录并从cat vendor/propel/propel1/runtime/lib/Propel.php目录中运行public,它运行正常。但是,我暂时禁用了SELinux,错误消失了。所以当然必须是SELinux。

正如我之前提到的,我尝试过:

chcon -R -h -t httpd_sys_content_t public/vendor/

但在执行此操作后,运行ls -alZ为我提供了以下供应商:

lrwxrwxrwx. staging developers unconfined_u:object_r:user_home_t:s0 vendor -> /home/staging/apache/somewebsite.co.uk/private/vendor/

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题最终成为我尝试设置SELinux类型的方式。

我在跑步:

chcon -R -h -t httpd_sys_content_t public/vendor/

然而,我必须跑:

chcon -R -h -t httpd_sys_content_t public/vendor

没有尾部斜杠。一旦我这样做,一切都立即生动。

注意:由于我的apache Options配置中没有Directory指令,因此我无需指定它,但仍然有效。