我目前在Media Temple上运行的CakePHP应用程序出现open_basedir restriction
错误。 (网站编号和域名因问题而更改)。
我在这里阅读了文档:https://kb.mediatemple.net/questions/514/How+do+I+set+the+path+for+open_basedir%3F#gs,了解如何解决此问题。
我在php.ini文件中尝试了以下内容:
open_basedir = /home/00000/domains
但仍然得到同样的错误。具体如下:
Warning (2): file_exists(): open_basedir restriction in effect. File(/home/00000/domains/test.com/html/app/webroot/index.php/img/cameron.jpg) is not within the allowed path(s): (/home/00000/domains) [APP/Plugin/Timthumb/Vendor/timthumb.php, line 896]
有什么想法吗?
当错误路径更新为我上面指定的内容时,肯定会应用更改,但我仍然受到open_basedir
限制。并且做phpinfo()也显示了变化:
更新:Media Temple不支持此功能,但已提供足够的礼貌以提供一些帮助,并表示我需要执行以下操作:
open_basedir = "/home/00000/data/tmp:/home/00000/domains"
但是这个STILL不起作用!他们无法提供进一步的信息。
更新2:启用了Mod_rewrite,我正在使用此插件:https://github.com/vishal-logiciel/TimthumbPlugin/
答案 0 :(得分:2)
你应该从你的open_basedir中删除最后的'/'。根据文档:
如果要限制仅访问指定目录,请以斜杠结束。例如:open_basedir = / dir / incl /
因此,您的条目仅适用于/ home / 00000 / domains,而不适用于任何子目录。
答案 1 :(得分:2)
问题看起来与您正在使用的框架无关 - 引发错误的供应商类不依赖于任何(相关的)外部配置。
但这不是open_basedir
解决方案。 (只要它包括/home/00000/domains/test.com/html/
应该没问题)。
file raising the error正在尝试访问(正确)导致问题的路径:
Warning (2): file_exists(): open_basedir restriction in effect.
File(/home/00000/domains/test.com/html/app/webroot/index.php/attachments/view/5)
^^^^^^^^^
is not within the allowed path(s): (/home/00000/domains)
[APP/Plugin/Timthumb/Vendor/timthumb.php, line 896
路径与文件冲突,即使打开基础目录允许,它也不可能是可读/可写路径。
使用的base path是derived from server variables - 它是否包含index.php
? :
protected function calcDocRoot(){
$docRoot = @$_SERVER['DOCUMENT_ROOT'];
if (defined('LOCAL_FILE_BASE_DIRECTORY')) {
$docRoot = LOCAL_FILE_BASE_DIRECTORY;
}
if(!isset($docRoot)){
$this->debug(3, "DOCUMENT_ROOT is not set. This is probably windows. Starting search 1.");
if(isset($_SERVER['SCRIPT_FILENAME'])){
$docRoot = str_replace( '\\', '/', substr($_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF'])));
$this->debug(3, "Generated docRoot using SCRIPT_FILENAME and PHP_SELF as: $docRoot");
}
}
if(!isset($docRoot)){
$this->debug(3, "DOCUMENT_ROOT still is not set. Starting search 2.");
if(isset($_SERVER['PATH_TRANSLATED'])){
$docRoot = str_replace( '\\', '/', substr(str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']), 0, 0-strlen($_SERVER['PHP_SELF'])));
$this->debug(3, "Generated docRoot using PATH_TRANSLATED and PHP_SELF as: $docRoot");
}
}
if($docRoot && $_SERVER['DOCUMENT_ROOT'] != '/'){ $docRoot = preg_replace('/\/$/', '', $docRoot); }
$this->debug(3, "Doc root is: " . $docRoot);
$this->docRoot = $docRoot;
}
如果index.php
不是来自docRoot
值,则它位于传递的参数$src
中。确定$src
包含无效路径的原因或方式,并正确更正应用程序代码。