web-dev-qa-db-ja.com

シンボリックリンクのコンテキストでPHPエラー「Failed open required」を解決するにはどうすればよいですか?

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が機能していることを確認するために、_~/Sites/epwbst/_の下にテストhtmlファイルを作成しました。Apacheは期待どおりに機能しました。

symlinkされたディレクトリでApacheがphpを実行できないのはなぜですか?

私のphp設定をここに貼り付けました: http://Pastebin.com/gg27JyVZ

4
Avery Chan

さて、これは私に時間。それはis権限の問題ですが、考えられる方法ではありません。問題は、シンボリックリンク自体の権限にあります。

/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に注意してください。 manページから:

...
-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は実際にはシンボリックリンクのアクセス許可に注意を払います。制限が厳しすぎると、_httpdユーザーが別の方法で同じターゲットを読み取って実行できたとしても、php5_moduleはターゲットの表示を拒否します/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(); ?>

うん。次に、そのユーザーがrun.../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].

はい?! WTF ?! Grrr!修正してください:

% 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 +ではない)は、umaskに関係なく、シンボリックリンクの作成中にカーネルレベルで777の権限を課します。

あなたと私は、HFS +でApache + PHPを実行しているソーラーシステムの2人のようですが、umaskをデフォルトよりも制限の厳しいものに設定しています。大文字と小文字を区別するHFS +も使用します。 ; o)

7
posita