PHP open_basedirとは

PHP open_basedirとは

Prestashop でスクリプトを実行しているときに、NGINX サーバーからこのエラーが発生しました。これは NGINX の設定などで解決できると思いますが、何をすべきか教えていただけると助かります。

Warning: file_exists(): open_basedir restriction in effect. 
File(/www/wwwroot/panel_ssl_site/../app/etc/env.php) is not within 
the allowed path(s): (/www/wwwroot/panel_ssl_site/) in
/www/wwwroot/panel_ssl_site/bridge_i15GpcsW.php on line 832
  • これをどうすれば解決できますか?

ありがとう、

ペッター

答え1

PHP open_basedirとは

PHPがアクセスできるファイルを、ファイル自体を含む指定されたディレクトリツリーに制限します。このディレクティブ影響を受けないセーフモードがオンかオフかによって異なります。

スクリプトが、たとえば include や fopen() を使用してファイル システムにアクセスしようとすると、ファイルの場所がチェックされます。ファイルが指定されたディレクトリ ツリーの外部にある場合、PHP はアクセスを拒否します。すべてのシンボリック リンクは解決されるため、シンボリック リンクを使用してこの制限を回避することはできません。ファイルが存在しない場合は、シンボリック リンクを解決できず、ファイル名が (解決された) open_basedir と比較されます。

open_basedir はファイルシステムの機能以外にも影響を与える可能性があります。たとえば、MySQL が mysqlnd ドライバーを使用するように設定されている場合、LOAD DATA INFILE は open_basedir の影響を受けます。PHP の拡張機能の多くは、このように open_basedir を使用します。

特別な値 . は、スクリプトの作業ディレクトリがベースディレクトリとして使用されることを示します。ただし、スクリプトの作業ディレクトリは chdir() で簡単に変更できるため、これは少し危険です。

httpd.conf では、他の設定ディレクティブと同様に、"php_admin_value open_basedir none" を使用して open_basedir をオフにすることができます (一部の仮想ホストなど)。

Windows では、ディレクトリをセミコロンで区切ります。その他のすべてのシステムでは、ディレクトリをコロンで区切ります。Apache モジュールとして、親ディレクトリからの open_basedir パスが自動的に継承されるようになりました。

open_basedir で指定される制限はプレフィックスではなくディレクトリ名です。

デフォルトでは、すべてのファイルを開くことができます。

リファレンス PHP.NET、1

結論

open_basedir を使用していますが、パスを更新していません。また、証拠からビジネス関連の環境を使用していないことがわかるため、この質問は Superuser で尋ねるべきだと思います。

php.ini (Debian 10 の場合)

; open_basedir, if set, limits all file operations to the defined directory
; and below.  This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
; Note: disables the realpath cache
; http://php.net/open-basedir
;open_basedir =

上記の例はDebian 10のDEFAULT設定であり、通常はphp.netのデフォルトでもあります。つまり、これを変更したということです。手動でまたは、パス名に「panel_ssl_site」が含まれていることから、管理パネルを使用していると思われます。このため、この質問はトピック外になります。ただし、すべての管理パネルでもこの​​設定を変更できるはずです。参照については、StackOverflowで同じ問題に

関連情報