在Media Temple上设置open_basedir

时间:2014-03-04 00:39:34

标签: php apache cakephp mediatemple

我目前在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()也显示了变化:

enter image description here

更新:Media Temple不支持此功能,但已提供足够的礼貌以提供一些帮助,并表示我需要执行以下操作:

open_basedir = "/home/00000/data/tmp:/home/00000/domains"

但是这个STILL不起作用!他们无法提供进一步的信息。

更新2:启用了Mod_rewrite,我正在使用此插件:https://github.com/vishal-logiciel/TimthumbPlugin/

2 个答案:

答案 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 pathderived 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包含无效路径的原因或方式,并正确更正应用程序代码。