我在 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
答案1
好吧,这让我疯了小时。 它是权限问题,但可能和人们想象的不一样。问题在于符号链接本身的权限:
/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)