【问题标题】:PHP tmp upload directory for multlple domains多个域的 PHP 临时上传目录
【发布时间】:2021-04-04 20:14:18
【问题描述】:

我在 Ubuntu 18.04 上的 Apache Web 服务器上托管多个域,但我无法为 PHP 设置 tmp 上传目录。

我尝试将其放入其中一个域的 .htaccess 中,但是在我测试时没有存储任何内容。

php_value upload_tmp_dir /var/www/example.com/tmp/

我对 /var/www/example.com/tmp/ 文件夹的权限设置为 Chmod 775

有没有一种可行的方法可以在 .htaccess 或域的 .conf 文件中进行设置?

【问题讨论】:

  • “但是没有任何效果。” - 你试过其他方法吗? .htaccess 仅在 PHP 作为 Apache 模块启用时才有效。是否在服务器配置中启用了 .htaccess 覆盖?你试过.user.ini吗?您是否尝试过在 PHP 脚本中设置值?
  • PHP 不会默默地失败(除非你告诉它)——你的日志怎么说?谁拥有tmp/ 目录? stackoverflow.com/questions/2900690/…
  • 你试过我的解决方案了吗?它对你有用还是你一直面临这个问题?

标签: php apache .htaccess ubuntu tmp


【解决方案1】:

我在本地机器上为我的虚拟主机做了类似的东西。请注意,所有内容都在我的虚拟主机中定义,因为您无法在运行时更改 upload_tmp_dirsys_temp_dir

<VirtualHost *:80>
    ServerName example.local
    ServerAlias www.example.local
    
    UseCanonicalName On
    
    <Directory /mnt/storage/Server/example>
        DirectoryIndex index.php
        #Options +Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    php_admin_value upload_tmp_dir /mnt/storage/Server/example/temp/
    php_admin_value sys_temp_dir /mnt/storage/Server/example/temp/
    
    DocumentRoot "/mnt/storage/Server/example"
    
    ErrorLog ${APACHE_LOG_DIR}/example.error.log
    CustomLog ${APACHE_LOG_DIR}/example.access.log combined
</VirtualHost>

如何确认一切正常

创建简单文件

$dir = sys_get_temp_dir();
$file = tempnam($dir, rand());
var_dump(get_current_user());
var_dump($dir);
var_dump('is_writable: ' . (int)is_writable($dir));
var_dump('is_readable: ' . (int)is_readable($dir));
var_dump($file);

上传脚本:创建名为upload.php的文件

<?php
if (isset($_POST['submit'])) {
    var_dump($_FILES);
}
?>
<!DOCTYPE html>
<html>
    <body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        Select image to upload:
        <input type="file" name="upload" id="upload">
        <input type="submit" value="Upload Image" name="submit">
    </form>
    </body>
</html>

【讨论】:

  • 非常感谢你,我觉得我在正确的轨道上,但什么都没有发生。我已更新我的答案以显示更多详细信息。你能复习一下吗?
  • @devwk 你也想在那里存储会话文件还是什么?
  • 我知道我现在需要做什么了。我已经解决了这个问题,并将奖励赏金给你 :) 谢谢
【解决方案2】:

更新:

尝试将其添加到您的虚拟主机配置文件中:

php_admin_value open_basedir none

它会暂时关闭open_basedir,如果这有效,则意味着您需要更改您的open_basedir 路径。


来自PHP manual

upload_tmp_dir 字符串

文件上传时用来存放文件的临时目录。必须可由任何运行 PHP 的用户写入。如果不指定 PHP 将使用系统的默认值。

如果此处指定的目录不可写,PHP 会回退到系统默认的临时目录。如果 open_basedir 开启,则必须允许系统默认目录才能成功上传。

所以要确保目录是可写的并且有足够的权限,创建不存在的目录。

【讨论】:

    【解决方案3】:

    这可以通过在您的 php.ini 文件中添加以下行来完成:

    upload_tmp_dir = /tmp or upload_tmp_dir = /tmp/whatever
    

    例子:

    ; http://php.net/upload-tmp-dir
    upload_tmp_dir="D:\xampp\tmp"
    

    或者,您可以通过在域的vhost.conf 文件中添加以下行来仅设置一个域。

    <Directory /path/to/vhosts/example.com/httpdocs>
       php_admin_value upload_tmp_dir /tmp
    </Directory>
    

    确保此位置可由相应的用户/组写入权限 777 检查您的 phpinfo(); 以查看其设置。在您进行更改之后。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2016-08-02
    • 1970-01-01
    • 2020-02-21
    • 2013-01-31
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多