我觉得这是一个很常见的问题,但是我找不到我感兴趣的信息,希望你能帮助我。我对服务器管理还不熟悉,所以不要批评我:)我将 nginx 安装在我的 debian 虚拟服务器上,并且已经安装了 php、mysql 和所有我需要的东西。但是当我开始使用我的 php 脚本时,我发现我无法通过 html 表单上传文件。
我制作了一些测试页面,发现提交表单后,我可以看到 $_FILES['tmp_name'],但 PHP 函数 move_uploaded_file 不起作用。它没有移动文件。
所以我开始谷歌搜索并找到大量有关 nginx_upload 模块等的信息。是否可以配置 nginx 来上传文件,或者我必须安装 nginx_upload 模块才能这样做?
我必须做什么才能允许将文件上传到我的 nginx 服务器。谢谢。
答案1
由于$_FILES['fieldname']['errors']
包含 0(即UPLOAD_ERR_OK
),因此实际上传已成功。失败的是尝试将临时文件移动到您指定的位置,这就是move_uploaded_file()
返回 false 的原因。您正在执行如下操作:
move_uploaded_file($_FILES['fieldname']['tmp_name'], '/srv/www/uploads')
最有可能的问题是 PHP 没有您指定为第二个参数的目录的写入权限。找出 PHP 以哪个用户身份运行(可能类似于www-data
),并确保该用户具有写入权限:
chown -R www-data /srv/www/uploads
chmod -R u=rwX,g=rwX,o=rX /srv/www/uploads
答案2
需要使用特殊模块通过 nginx 来处理进度条等。没有什么如果不需要渐进式更新功能,则需要特殊注意。
您很可能需要创建具有不同权限的专用上传目录。大多数情况下,chmod 1770 /path/to/upload_dir 就可以了。
官方文档可能不会推荐其中一种方法,因为允许上传到 PHP 正在读取文件的同一服务器会带来相当严重的安全隐患。如果他们推荐一种方法,而该方法被证明存在漏洞,他们可能会感到有责任。
一旦它正常工作,请测试并验证您无法上传 .php 文件,然后通过简单的 URL 调用它。