PHP 多个域的 tmp 上传目录

PHP tmp upload directory for multlple domains

我在 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 文件中进行设置的有效方法?

更新:

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

php_admin_value open_basedir none

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


来自PHP manual

upload_tmp_dir string

The temporary directory used for storing files when doing file upload. Must be writable by whatever user PHP is running as. If not specified PHP will use the system's default.

If the directory specified here is not writable, PHP falls back to the system default temporary directory. If open_basedir is on, then the system default directory must be allowed for an upload to succeed.

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

我在我的本地机器上为我的虚拟主机制作了类似的东西。请注意,所有内容都在我的虚拟主机中定义,因为您无法在运行时更改 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>

这可以通过在 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>

确保此位置可通过适当的 user/group 权限写入 777 检查您的 phpinfo(); 以查看其设置。进行更改后。