Apache-2.2

如何解決符號連結上下文中的 PHP 錯誤“需要打開失敗”?

  • October 11, 2015

我在 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

好吧,這讓我發瘋了好幾個小時。這一個權限問題,但不是人們的想法。問題在於符號連結本身的權限:

/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 license@php.net.

是的?!怎麼回事?!***呸!***現在修復它:

% 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)

引用自:https://serverfault.com/questions/393240