AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 393240
Accepted
Son of the Wai-Pan
Son of the Wai-Pan
Asked: 2012-05-28 23:34:06 +0800 CST2012-05-28 23:34:06 +0800 CST 2012-05-28 23:34:06 +0800 CST

如何解决符号链接上下文中的 PHP 错误“需要打开失败”?

  • 772

我在 MacOS X Lion 10.7.4 上运行 Apache/PHP。我的目录结构是这样设置的:

/Users/achan/Sites/
lrwxrwx---   1 achan  staff    23B Apr 27 16:21 epwbst@ -> /Users/achan/dev/epwbst`

epwbst/里面的符号链接在哪里~/Sites。

如果我放在test.php目录Sites/中,Apache 会正确提供文件;phpinfo()它像它应该的那样喷出。如果我将相同的文件放在符号链接下,则会出现此错误:

[Mon May 28 14:47:13 2012] [error] [client ::1] PHP Warning:  Unknown: failed to open stream: No such file or directory in Unknown on line 0
[Mon May 28 14:47:13 2012] [error] [client ::1] PHP Fatal error:  Unknown: Failed opening required '/Users/achan/Sites/epwbst/test.php' (include_path='.:/usr/lib/php/pear') in Unknown on line 0

为了确保 Apache 正常工作,我在下面创建了一个测试 html 文件~/Sites/epwbst/,Apache 按预期提供了它。

为什么 Apache 不能在我的符号链接目录下运行 php?

我在这里粘贴了我的 php 配置:http: //pastebin.com/gg27JyVZ

php mac-osx apache-2.2
  • 1 1 个回答
  • 28225 Views

1 个回答

  • Voted
  1. Best Answer
    posita
    2014-04-23T13:07:55+08:002014-04-23T13:07:55+08:00

    好吧,这让我抓狂了几个小时。这是一个权限问题,但不是人们的想法。问题在于符号链接本身的权限:

    /Users/achan/Sites/
    lrwxrwx---   1 achan  staff23B Apr 27 16:21 epwbst@ -> /Users/achan/dev/epwbst`
    

    这就是问题所在:chmod通常不会更改符号链接的权限,因为(除了明显的例外php5_module和超出此答案范围的其他一些情况)这些权限在很大程度上是无关紧要的,因为它们在几乎所有上下文中都被忽略了。这是修复:

    chmod -h 755 /Users/achan/Sites/epwbst
    

    注意-h. 从手册页:

    ...
    -h  If the file is a symbolic link, change the mode of the link itself
    rather than the file that the link points to.
    ...
    

    出于某种原因,php5_module实际上要注意符号链接上的权限。如果它们限制太多,php5_module将拒绝查看目标,即使httpd用户可以使用/usr/bin/php.

    考虑以下:

    % umask 027
    % cd ~/Sites
    % mkdir bar
    % chmod 755 bar
    % ln -sv bar foo
    foo -> bar
    % ls -al ~/Sites/foo
    lrwxr-x---  1 xyz  xyz  3 Apr 22 13:17 foo -> bar
    % ls -adl ~/Sites/foo/.
    drwxr-xr-x  2 xyz  xyz  68 Apr 22 13:17 /Users/xyz/Sites/foo/.
    % echo 'Hello!' >bar/hello.txt
    % chmod 644 bar/hello.txt
    % curl http://localhost/~xyz/bar/hello.txt
    Hello!
    % curl http://localhost/~xyz/foo/hello.txt
    Hello!

    到目前为止,一切都很好。现在考虑:

    % echo '<?php phpinfo(); ?>' >bar/info.php
    % chmod 644 bar/info.php
    % curl http://localhost/~xyz/bar/info.php
    <html xmlns="http://www.w3.org/1999/xhtml"><head>
    ...
    </div></body></html>
    % curl http://localhost/~xyz/foo/info.php
    <br />
    <b>Warning</b>:  Unknown: failed to open stream: No such file or directory in <b>Unknown</b> on line <b>0</b><br />
    <br />
    <b>Fatal error</b>:  Unknown: Failed opening required '/Users/xyz/Sites/foo/info.php' (include_path='.:') in <b>Unknown</b> on line <b>0</b><br />

    嗯。我httpd以用户身份运行_www,所以让我们检查一下该用户是否可以阅读.../foo/info.php:

    % sudo sudo -u _www cat ~/Sites/foo/info.php
    Password:
    <?php phpinfo(); ?>
    

    是的。现在让我们看看该用户是否可以运行 .../foo/info.php:

    % sudo sudo -u _www /usr/bin/php ~/Sites/foo/info.php
    Password:
    phpinfo()
    PHP Version => 5.4.24
    ...
    If you did not receive a copy of the PHP license, or have any
    questions about PHP licensing, please contact [email protected].
    

    是的?!卧槽?!哎呀!现在修复它:

    % chmod -h 755 foo
    % curl http://localhost/~xyz/foo/info.php
    <html xmlns="http://www.w3.org/1999/xhtml"><head>
    ...
    </div></body></html>

    砰。完毕。

    所以,是的。似乎php5_module做了一些偏执和不标准的事情。这可能被忽视了,因为umask通常默认为022,它至少会创建与 的符号链接755。此外,许多文件系统(不是 HFS+)在符号链接创建期间在内核级别强加 777 权限,而不管umask.

    你和我似乎是太阳系中的两个人,在 HFS+ 上运行 Apache+PHP,同时将我们的 umask 设置为比默认值更严格的东西。我敢打赌,您甚至还会使用区分大小写的 HFS+。;o)

    • 10

相关问题

  • 用户特定的 Php.ini 当 php 作为模块运行时?

  • 使 php mail() 函数在 ubuntu-server 上工作的步骤是什么?

  • Web 服务器和数据库服务器位于完全不同的位置

  • PHP 作为 CGI 还是 Apache 模块?

  • 通过 VPN 连接什么是远程服务器 IP?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve