【问题标题】:is_dir returning false on symlinks in apacheis_dir 在 apache 中的符号链接上返回 false
【发布时间】:2011-10-21 15:28:23
【问题描述】:

我在我的 Mac 上的本地 AMP 堆栈上运行第三方 PHP 应用程序。我最近购买了一台带有 Lion 的新 Mac Mini,并正在尝试设置它。我以前的电脑是带有 MAMP 的 MB air。现在我正在使用内置的 apache/php 和一个自制的安装 MySQL。

这是我的问题:我有一个带有符号链接的目录。这些符号链接指向目录,PHP 应用程序正在使用is_dir() 检查这些符号链接。

在我的 Lion AMP 设置中,is_dir() 失败。我的 Snow Leopard MAMP is_dir() 上的相同设置适用于我的符号链接。

这就是它变得更加好奇的地方。如果我执行php -a(php 交互式命令行模式),并在相同的目录上执行is_dir(),它返回true。它仅在 apache 请求的上下文中返回 false。这让我认为这与 apache 用户(_www)无法访问符号链接有关。解决此问题超出了我的专业知识范围。

其他说明:

  1. 是的,我在我的 apache 配置中打开了 FollowSymLinks,并且在 事实上,有问题的符号链接所在的目录是 符号链接本身。 Apache 对此没有任何问题。直到 PHP is_dir() 是 用过。
  2. 不,我无法编辑 PHP 应用程序,只能使用 is_link()readlink()
  3. 这个完全相同的设置适用于我的 Snow Leopard/MAMP 设置。

有什么想法吗?

【问题讨论】:

  • 在您真正递归到它们之前,符号链接是否仍被视为文件?

标签: php apache macos symlink osx-lion


【解决方案1】:

我遇到了类似的问题。我创建了以下链接:

cd /home/mike/uploads
ln -s ./data /sites/www.test.com/docroot/data

然后我在 /sites/www.test.com/docroot 中创建了一个 test.php 文件,该文件执行了以下操作:

$dir = "/sites/www.test.com/docroot/data";
"is_dir\t\t" .is_dir($dir) ."\n";

当我从命令行运行 test.php 时,它会显示 is_dir 为 True,但是当我通过 apache 从浏览器加载 test.php 时,它显示为 False。

我去了 /sites/www.test.com/docroot/data 并做了一个

chmod -R 755 .

这并没有改变什么。然后我意识到,实际符号链接目录的 需要适当的权限集(/home/mike/uploads)。我在那个目录上做了一个 chmod,一切正常!

【讨论】:

    【解决方案2】:

    啊,看到您将它们更改为777 的评论,但仍然想知道为什么它不起作用。 我下面的解决方案可能对您没有帮助。

    编辑:

    如果您有权访问 /etc/apache2/httpd.conf
    通过 sudo vi /etc/apache2/httpd.conf 对其进行编辑。
    然后更改这些行中的这 1 行或两者都更改

    User _www
    Group _www
    

    这是我的目录列表示例。

    ace:remote-app ace (git::master)$ ls -al
    total 72
    drwxr-xr-x  24 ace  staff   816  7 Aug 00:24 .
    drwxr-xr-x  11 ace  staff   374  4 Aug 13:46 ..
    drwxr-xr-x   3 ace  staff   102 12 Jul 17:06 .bundle
    drwxr-xr-x  14 ace  staff   476  7 Aug 02:29 .git
    -rw-r--r--   1 ace  staff   100  1 Aug 19:20 .gitignore
    -rw-r--r--   1 ace  staff     9  1 Aug 19:20 .rspec
    drwxrwxr-x  10 ace  staff   340 14 Jul 15:58 public
    

    现在我的公共目录拥有775 权限,这意味着ownergroup 拥有完全权限,而其他用户只能读取和执行。
    这取决于您是希望 apache 用户从默认的 _www 变为 ace,还是让 apache 组从默认的 _www 变为 staff

    一旦您决定要更改哪个,请重新启动 apache。

    /usr/sbin/apachectl graceful
    

    您的页面现在应该可以访问目录/文件了。
    需要注意的一件事是,您必须更改已由您的网页写入的文件的所有权,因为这些文件拥有 _www:_www 所有权,并且在重新启动后您将无法访问它们。
    你可以通过这个来改变他们的新所有权,-R是让它递归的。

    sudo chown -R newapacheuser:newapachegroup <path>
    

    【讨论】:

    • 谢谢,这有帮助。我将 httpd.conf 中的用户和组更改为我的用户名和组。不完全理想,但这只是为了我的本地发展,所以我可以忍受它。我仍然不确定为什么将事物设置为 777 并没有使 _www 用户可以访问,但我将继续前进并停止摆弄这个。感谢您的帮助。
    【解决方案3】:

    您是否检查了权限/所有者?

    来自 PHP 手册:注意:此函数的结果被缓存。

    【讨论】:

    • 我将这些符号链接及其相关目录的权限更改为 777。这应该足够了,不是吗?
    • 也许 CGI 和命令行设置的 php.ini 有所不同。在 CGI 之上还有 Apache。如果 CLI 有效,而 CGI 无效,那么我认为存在配置问题。
    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多