PHP文件上传在Windows正常,部署到RHEL Linux后无法运行
我开发的音频上传混音网站,从Windows服务器迁移到RHEL Linux后,文件上传功能失效。用极简测试脚本验证时,Windows下正常运行,RHEL上仅返回Error moving the uploaded file!。已确认$_FILES['file']['error']为0(无上传错误),/tmp目录为空,且尝试过修改/tmp的chown和chmod权限。目标是让文件成功上传至/var/www/html/,用于后续混音操作。
测试用上传代码
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) { $tempFile = $_FILES['file']['tmp_name']; $targetDir = '/var/www/html/'; $targetFile = $targetDir . basename($_FILES['file']['name']); if (move_uploaded_file($tempFile, $targetFile)) { echo 'File uploaded and moved successfully.'; } else { echo 'Error moving the uploaded file.'; } } else { echo 'Error uploading file. Error code: ' . $_FILES['file']['error']; } } ?> <form method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit">Upload</button> </form>
排查与解决步骤
检查目标目录权限
确保/var/www/html/的所有者是Web服务器运行用户(RHEL通常为apache),并赋予写入权限:chown -R apache:apache /var/www/html/ chmod -R 755 /var/www/html/若需更严格权限,可设置
750,确保所有者组具备写入权限。验证PHP临时上传目录配置
查看php.ini中upload_tmp_dir的配置,确认路径有效且Web服务器有读写权限:php -i | grep upload_tmp_dir若配置为空或路径无效,修改
php.ini(路径通常为/etc/php.ini或/etc/php/[版本]/apache2/php.ini):upload_tmp_dir = /tmp修改后重启Web服务器和PHP-FPM(若使用):
systemctl restart httpd systemctl restart php-fpm处理SELinux限制(RHEL核心问题)
RHEL默认启用SELinux,可能拦截Web服务器的写入操作。查看目录SELinux上下文:ls -Z /var/www/html/设置允许Web服务器写入的上下文:
chcon -R -t httpd_sys_rw_content_t /var/www/html/若需永久生效,添加SELinux规则:
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?" restorecon -R /var/www/html/临时文件存在性验证
在move_uploaded_file前添加调试代码,确认临时文件是否存在:if (!file_exists($tempFile)) { echo 'Temporary file missing: ' . $tempFile; exit; }若临时文件不存在,需检查
php.ini中的post_max_size、upload_max_filesize参数是否足够大,确保能容纳上传的音频文件。
内容的提问来源于stack exchange,提问作者dr3kiki

