open_basedir限制生效。文件(/)不在允许的路径中:

时间:2009-12-04 13:17:28

标签: php filesystems

我在我网站上的头像上传时遇到此错误。我以前从来没有得过它,最近没有任何改变让我开始收到这个错误......

Warning: is_writable() [function.is-writable]: 
open_basedir restriction in effect. 
File(/) is not within the allowed path(s):

16 个答案:

答案 0 :(得分:88)

修改主机帐户中的open_basedir设置并将其设置为none。找到Plesk / cPanel的“PHP设置”区域下给出的open_basedir设置。从那里给出的下拉列表中将其设置为“none”。 我在Plesk小组图片中展示了它们。

enter image description here enter image description here

答案 1 :(得分:35)

要解决此错误,您必须编辑httpd.conf文件。 之前的方法可以在apache2handler section指令Server Root中的phpinfo中看到。 例如,在我的情况下这样 - / etc / httpd / httpd.conf。 打开文件httpd.conf,找到open_basedir参数的提及。并将其设置为无。 ( php_admin_value open_basedir none

答案 2 :(得分:5)

对我来说,运行整个事情的Plesk服务器的问题是糟糕/缺少配置值。 我只是按照这里的指示: http://davidseah.com/blog/2007/04/separate-php-error-logs-for-multiple-domains-with-plesk/

您可以将PHP配置为每个VirtualHost定义都有一个单独的错误日志文件。诀窍是确切知道如何设置它,因为你不能在不破坏Plesk的情况下直接触摸配置。 您(dv)上的每个域名在/ var / www / vhosts中都有自己的目录。典型目录具有以下顶级目录:

cgi-bin/
conf/
error_docs/
httpdocs/
httpsdocs/
...and so on

您需要在域目录的conf /文件夹中创建一个vhost.conf文件,其中包含以下行:

php_value error_log /path/to/error_log
php_flag display_errors off
php_value error_reporting 6143
php_flag log_errors on

更改第一个值以匹配您的实际安装(我使用了/tmp/phperrors.log)。编辑完vhost.conf文件后,使用以下命令从控制台测试配置:

apachectl configtest
…or if you don’t have apachectl (as Plesk 8.6 doesn’t seem to)…

/etc/init.d/httpd configtest

最后告诉Plesk你做了这个改变。

/usr/local/psa/admin/bin/websrvmng -a

答案 3 :(得分:3)

如果您使用php file.php运行此功能。您需要修改php.ini 找到这个文件:

: locate php.ini
/etc/php/php.ini

并附加文件到open_basedir属性的路径:

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/:/run/media/andrew/ext4/protected

答案 4 :(得分:2)

您引用的路径是incorect,而不是工作区的directoryRoot。尝试构建您要访问的文件的绝对路径,现在您可能正在使用相对路径......

答案 5 :(得分:2)

如果你遇到ispconfig3的这种问题并且出现了这样的错误

  

open_basedir限制生效。   文件(/ var / www / clients / client7 / web15)不在允许范围内   路径(S):.........

要解决它(在我的情况下),只需在网站的ispconfig3面板中将PHP设置为SuPHP

希望它可以帮助某人:)

答案 6 :(得分:2)

在更新和/或移动后,我的一个wordpress网站遇到了这个问题:)

在数据库表'wp_options'中检查'upload_path'并正确编辑...

答案 7 :(得分:1)

如果使用ispconfig3:

转到网站部分->选项-> PHP open_basedir:

enter image description here

  • 在此字段中描述了允许的路径,并且每个路径都分开 与“:”

/ var / www / clients / client2 / web3 / image:/ var / www / clients / client2 / web3 / web:/ var / www / ... 等等

  • 因此,这里必须放置您要访问的路径,在我的情况下是:

/ var / www / clients / client2 / web3 / image:

  • 出现此问题的原因是:

当脚本尝试访问文件系统时,例如使用include或fopen(),将检查文件的位置。当文件位于指定的目录树之外时,PHP将拒绝访问它。

答案 8 :(得分:0)

如果您正在运行 PHP IIS堆栈,并且出现此错误,则通常是快速权限修复。

如果您自己管理Windows服务器并具有访问权限,请首先尝试以下方法:

导航到使您悲伤的文件夹,然后右键单击它>打开属性>安全。

查看哪些用户有权访问该文件夹,哪些用户具有只读权限,哪些用户具有完整权限。您是否有一个阻止写操作的组?

此修复程序将特定于您的IIS设置,您是否对特定用户IUSR或应用程序池标识使用匿名身份验证?

无论如何,您最终将为IUSR,IIS_IUSRS或您的应用程序池标识之一添加新的完全写入权限-正如我说的那样,这将取决于您的设置和您想要的方式做到这一点,您可以在这个谷歌兔子洞上走(一个这样的帖子-IIS_IUSRS and IUSR permissions in IIS8)。对我来说,我将anon与我的应用程序池标识一起使用,这样我就可以完全阅读并MACHINE_NAME\IIS_IUSRS / write在任何临时或上载文件夹上。

我不需要在php.ini的open_basedir =中添加任何其他内容。

答案 9 :(得分:0)

除了@yogihosting's answer,如果您使用的是 DirectAdmin ,请按照以下步骤操作:

  1. 转到DirectAdmin的登录页面。通常,其端口为2222。
  2. 以管理员身份登录。默认情况下,其用户名是admin
  3. 从右侧面板上的“访问级别”,确保您处于“管理员级别”。如果没有,请更改它。
  4. 从“其他功能”部分,单击“自定义HTTPD配置”。
  5. 选择要更改的域。
  6. 在页面顶部的文本区域中输入要更改的配置。您应该考虑现有的配置文件并基于该文件修改值。例如,如果您看到open_basedir内设置了<Directory>,也许您应该将更改包含在相关的<Directory>标记中:

    <Directory "/path/to/directory">
        php_admin_value open_basedir none
    </Directory>
    
  7. 进行必要的更改后,单击“保存”按钮。

  8. 如果更改有效,您现在应该看到所做的更改保存到配置文件中。

但是,还有另一种编辑配置文件的方式:

警告:请小心,使用以下步骤需要您自担风险,因为这可能会导致错误或导致停机。推荐的方法是前一种,因为它可以防止您不正确地修改配置文件并向您显示错误。

  1. 以root用户身份登录到服务器。
  2. 转到/usr/local/directadmin/data/users。从列出的用户中,转到与您要更改的域相关的一个。
  3. 在这里,有一个httpd.conf文件。从中备份:

    cp httpd.conf httpd.conf.back
    
  4. 现在使用您选择的编辑器编辑配置文件。例如,将现有的open_basedir编辑为none。请勿尝试移除物品,否则可能会导致停机。编辑后保存文件。

  5. 使用以下方式之一重新启动Apache Web服务器(如果需要,请使用sudo):

    httpd -k graceful
    apachectl -k graceful
    apache2 -k graceful
    
  6. 如果遇到任何错误,请用备份的文件替换主配置文件,然后重新启动Web服务器。

同样,第一个解决方案是首选的解决方案,您不应在第一时间尝试第二种方法。请注意,第一种方法的优点是可以防止保存配置错误的内容。

希望有帮助!

答案 10 :(得分:0)

我正在使用Apache vhost -文件在Windows服务器上运行带有应用程序特定ini-options的PHP。因此,我使用php-command的 -d 选项。

我将每个应用程序的 open_basedir 设置为这些选项之一。

我需要将多个URL设置为open_basedir,包括 UNC路径,这种情况的语法有点难找。您必须使用分号分隔路径,如果第一个路径以盘符开头,则可能也必须以分号开头。至少那对我有用。

示例:

php.exe -d open_basedir=;d:/www/applicationRoot;//internal.unc.path/ressource/

答案 11 :(得分:0)

我在 Directadmin 面板上上传了我的 codeigniter 项目。我遇到了同样的错误。 error

然后我更改了 php 设置。

open_basedir = session.save_path = ./temp/

然后它对我有用。

答案 12 :(得分:0)

编辑位于主目录中的 php.ini 或 .user.ini

open_basedir = none

答案 13 :(得分:-1)

只需搜索

  

open_basedir =

在php.ini中

并禁用它。这是解决此问题的最简单的解决方案。

更改前open_basedir =

更改后;open_basedir =

P.s-更改后不要忘记重新启动服务器。

享受;)

答案 14 :(得分:-1)

检查 plesk 中的 \httpdocs\bootstrap\cache\config.php 文件,看看是否有一些不需要的路径。

答案 15 :(得分:-12)

修改PHP配置中的open_basedir settings(参见Runtime Configuration)。

open_basedir设置主要用于防止特定用户的PHP脚本访问其他用户帐户中的文件。通常,您自己帐户中的任何文件都应该由您自己的脚本读取。

如果PHP在Linux系统上作为Apache模块运行,则通过.htaccess进行示例设置:

<DirectoryMatch "/home/sites/site81/">
    php_admin_value open_basedir "/home/sites/site81/:/tmp/:/"
</DirectoryMatch>