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


87

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

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

18
您接受了无效的答案。
sjas 2015年

Answers:


-22

修改PHP配置中的open_basedir设置(请参阅运行时配置)。

open_basedir设置主要用于防止特定用户的PHP脚本访问另一个用户帐户中的文件。因此,通常,您自己的帐户中的任何文件都应该可以被您自己的脚本读取。

通过.htaccessPHP在Linux系统上是否作为Apache模块运行的示例设置:

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

2
@Nikesh我将其放入.htaccces并将路径更改为:后,这给了我500错误/my/cutsom/dir/。不知道为什么会这样。
hitautodestruct

79
太酷了,到目前为止,有12票赞成错误答案。您不能php_admin_value.htaccess文件中使用您不能在.htaccess文件中使用DirectoryMatch。(open_basedir如果只是将其禁用,将采取什么样的安全措施?)
ÁlvaroGonzález13年

1
@eoinoc-向下滚动并查看例如Andrei的答案。或编辑全局php.ini文件。
阿尔瓦罗·冈萨雷斯

19
您不要将其投入到成功中!然后将其添加到您的配置文件中。
tfont

8
将根目录包含在open_basedir中完全破坏了open_basedir的目的。该解决方案仅在实质上禁用该限制的意义上“起作用”。
马丁

113

修改托管帐户中的open_basedir设置,并将其设置为none。找到Plesk / cPanel的“ PHP设置”区域下提供的open_basedir设置。从此处提供的下拉菜单中将其设置为“无”。我已经在Plesk面板图片中显示了它们。

在此处输入图片说明 在此处输入图片说明


1
@yogihosting执行此操作后出现错误-无法找到您指定的模型:Home_model
Heemanshu Bhalla

1
有点晚了,但是有没有办法对所有plesk网站执行此操作?对于站点正在使用的版本,我在全局php.ini中将其设置为none:gyazo.com/dfffbe7f9b3a20ede97da72f1ddfc777 但是他们仍然会收到错误。
马特·考利

@MattCowley,您必须为plesk面板中托管的每个站点执行此操作。
yogihosting

1
很有帮助的答案,我的问题解决了竖起大拇指:)
muhammadanish

1
感谢您的解决方案!对于共享托管,这对我来说是完美的!
Smilefounder '17

38

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


设置为“无”对我有用-也使用Plesk界面。
diggersworld 2014年

8
我在中找到了open_basedir配置php.ini。(使用php 5在Raspberry Pi上实现Arch Linux)
dennisschagt 2014年

2
也可以在我的php.ini(也称为Arch)中找到它。只需注释掉该行即可获得与该答案相同的效果。
本·埃尔加

@BenElgar只是在评论该行提到了作品时,我只是问那里是否存在风险
mwangaben

6

如果您使用来运行它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


这是指向多个特定路径的唯一解决方案,而不仅仅是完全跳过安全性。
mvreijn

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

2

您所引用的路径是错误的,并且没有工作空间的directoryRoot。尝试为要访问的文件构建绝对路径,现在您可能正在使用相对路径...


它使用的是绝对路径。它适用于除此用户之外的所有用户。
Webnet

2

如果您在使用ispconfig3时遇到这种问题,并且出现了这样的错误

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

要解决此问题(在我的案例中),只需在ispconfig3网站的面板中将PHP设置为SuPHP。

希望它可以帮助某人:)


2

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

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


您将其设置为什么值?/[...]/public_html/wp-content/uploads?
布雷特

1

如果使用ispconfig3:

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

在此处输入图片说明

  • 在此字段中描述了允许的路径,每个路径都用“:”分隔

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

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

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

  • 出现问题是因为:

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


0

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

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

导航到该文件夹​​,让您对其写入感到悲伤,然后右键单击它>打开属性>安全性。

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

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

无论如何,您最终将为IUSR,IIS_IUSRS或您的应用程序池标识之一添加新的完全写权限-正如我说的那样,这将取决于您的设置和操作方式,您可以在此工具上放下Google兔子漏洞(一个这样的帖子-IIS8中的IIS_IUSRS和IUSR权限)对我来说,我将anon与我的应用程序池标识一起使用,以便可以随意MACHINE_NAME\IIS_IUSRS读取或写入任何临时文件或上传内容文件夹。

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


0

除了@yogihosting的答案之外,如果您使用的是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_basedirnone。请勿尝试移除物品,否则可能会导致停机。编辑后保存文件。

  5. 使用以下方法之一重新启动Apache Web服务器(sudo必要时使用):

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

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

希望能帮助到你!


0

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

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

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

例:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.