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

Ave*_*han 4 php mac-osx apache-2.2

我在 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`
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

pos*_*ita 8

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

/Users/achan/Sites/
lrwxrwx---   1 achan  staff23B Apr 27 16:21 epwbst@ -> /Users/achan/dev/epwbst`
Run Code Online (Sandbox Code Playgroud)

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

chmod -h 755 /Users/achan/Sites/epwbst
Run Code Online (Sandbox Code Playgroud)

请注意-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.
...
Run Code Online (Sandbox Code Playgroud)

出于某种原因,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!
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。现在考虑:

% 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 />
Run Code Online (Sandbox Code Playgroud)

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

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

是的。现在让我们看看该用户是否可以运行 .../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 license@php.net.
Run Code Online (Sandbox Code Playgroud)

是的?!跆拳道?!呸!现在修复它:

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

砰。完毕。

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

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

  • 这个太阳系外的许多人类感谢您的回答!:) 不过,在这个太阳系中,你必须接受我的感谢... :) (2认同)