7

我在一个域上有一个站点,我们称之为“ mydomain.com”,人们可以在其中登录。这个域有一个子域sub.mydomain.com

uploads当用户在主域上上传文件时,我想将其移动到sub.mydomain.com. 我要将文件移动到的文件夹具有完全的写入/读取权限。

我上传文件的代码:

$filename = 'background_' . $_SESSION['username'] . '.jpg';
if (is_uploaded_file($_FILES['background']['tmp_name'])) 
    {  
        move_uploaded_file($_FILES['background']['tmp_name'], 
        "/var/www/vhosts/mydomain.com/subdomains/sub/httpdocs/uploads/" . $filename);
    }

运行此代码时,我收到以下警告/错误:

Warning: move_uploaded_file() [function.move-uploaded-file]: open_basedir restriction in effect. File(/var/www/vhosts/mydomain.com/subdomains/sub/httpdocs/uploads/background_User.jpg) is not within the allowed path(s): (/var/www/vhosts/mydomain.com/httpdocs:/tmp) in /var/www/vhosts/dezeactie.nl/httpdocs/opmaak.php  on line 152

谁能启发我解决我的问题?

最后一点:我知道我可以在子域上登录并直接在那里上传文件,但是我想保留主域上的登录以用于其他目的。

提前致谢。

于尔根

4

4 回答 4

4

您的托管服务不允许您的脚本在httpdocs每个虚拟主机的目录和共享/tmp目录之外执行任何操作。这严重限制了站点之间信息交换的可能性。

我能想到的技巧:

  1. 在源站点的目录中存储一个临时文件,/tmp并在目标站点中触发一个进程来获取该文件。您可以使用 curl 函数来执行此操作。

  2. 将文件存储在通用数据库中。如果您认为存储会影响您的站点性能,则无需永久存储。目标站点只需要检查它是否有待处理的传入文件。

  3. 将文件添加到队列(可能是内部的特殊目录httpdocs)并编写命令行脚本将它们推送到目标站点。使用 cron 运行此命令(比如说,每分钟一次)。

恕我直言,#2 看起来可行且可靠。

于 2010-06-29T11:50:42.703 回答
0

正如错误消息所暗示的那样,文件访问仅限于使用open_basedir指令的某些目录php.ini

如果您有权访问服务器的配置,则可以更改它。

于 2010-06-29T11:54:48.220 回答
0

为什么不为您的子域创建一个符号链接,然后通过 sub.domain.com url 访问图像?

于 2010-06-29T12:30:50.610 回答
0

这里的大多数解决方案似乎有点过分。我已经编写了自己的解决方案。带上一粒盐;我不经常使用 PHP。

// MAIN DOMAIN - index.php

/**
 * @param String $target - file name under the image you are saving
 * @param String $subdomain - target subdomain, in which, you wish to save your image
 */
function saveImage($target, $subdomain) {
    $context = stream_context_create(array('http' =>
        array(
            'method' => 'POST',
            'header' => 'Content-type: application/x-www-form-urlencoded',
            'content' => http_build_query(
                array(
                    'target' => $target,
                    'contents' => file_get_contents($_FILES['image_upload']['tmp_name'])
                )
            )
        )
    ));
    
    return file_get_contents('http://' . $subdomain . '.' . $_SERVER['HTTP_HOST'] . '/save_image.php', false, $context);
}

saveImage("test.png", "cdn");


// SUBDOMAIN - save_image.php

file_put_contents($_POST['target'], $_POST['contents']);
    
echo 'http://' . $_SERVER['HTTP_HOST'] . '/' .$target;

我现在意识到这将允许任何用户发出发布请求以将图像保存到子域;然而,由于 PHP 是后端,简单的替代方法是传递在 PHP 中声明的密钥。IE

// MAIN DOMAIN - index.php

$key = "A4g8S8"; // hash this and pass it through the request body


// SUBDOMAIN - save_image.php

if ($_POST['key'] == "A4g8S8") {
    // code here
}
于 2022-01-23T05:55:31.717 回答