无法通过 Wordpress 上传器上传媒体

Posted

技术标签:

【中文标题】无法通过 Wordpress 上传器上传媒体【英文标题】:Cannot upload media via Wordpress uploader 【发布时间】:2011-02-27 14:53:10 【问题描述】:

这与 Wordpress 中的媒体上传有关。

每次 WP 为新上传创建一个文件夹(它按年和月组织上传:yyyy/mm),它使用“apache:apache”用户和组创建它,具有对所有(777 或 @987654321)的完全访问权限@)。

但是,之后,WP 无法在该文件夹中创建文件夹(例如:mkdir 2011 成功,但 mkdir 2011/01 失败)。此外,即使权限为 777 (rwxrwxrwx),上传也无法移动到这些新创建的文件夹中。

每月一次,我必须 chown 新创建的文件夹与 user:group 的其余文件相同。一旦我这样做了,上传就可以正常工作(这对我来说没有意义真正令人沮丧的部分是,在同一服务器上其他域上的其他 WP 安装中不存在此问题。

* 我不确定这应该在这里还是服务器故障。


编辑:包含目录/.../httpdocs/blog/wp-content/uploads 拥有正确的所有权

drwxrwxrwx 5 myuser psaserv 4096 Jun  3 18:38 uploads

这是由 Media Temple (dv) 托管的 Plesk/CentOS 环境。

我已经编写了以下测试脚本来模拟问题

<pre><?php 

$d = "d" . mt_rand(100, 500);

var_dump(
    get_current_user(),
    $d,
    mkdir($d),
    chmod($d, 0777),
    mkdir("$d/$d"),
    chmod("$d/$d", 0777),
    fileowner($d),
    getmyuid()
);

脚本总是成功创建第一个目录mkdir($d)。在 WP 问题所在的域 A 上,它无法创建嵌套目录 mkdir("$d/$d")。但是,在域 B 上,两个目录都已成功创建。

我分别在/var/www/vhosts/domainA/httpdocs/tmp/t.php/var/www/vhosts/domainB/httpdocs/tmp/t.php 运行每个脚本我检查了tmphttpdocsdomain[AB] 的权限,它们对于每个路径都是相同的。唯一不同的是用户。

【问题讨论】:

我曾经在 Plesk 服务器上使用 WordPress 时遇到过这个问题,但一直没有弄清楚如何修复它并最终将其移至另一台主机。 该死,我在同一条船上。这不是很有希望。 【参考方案1】:

在 2010 目录之上的目录中检查 setuid 或 setgid 位。 ls -l 将在目录的权限中包含 s 或 S。确保此目录拥有正确的所有权。

【讨论】:

我尝试了在包含 tmp 的目录上设置和不设置 s 的示例脚本,但我无法创建嵌套文件夹(请参阅我的编辑)。 目录是在两个域上作为同一用户创建的吗?将目录树一直与 / 进行比较。在树的更深处可能存在权限问题。 我将目录树一直比较到两个域所在的/var/www/vhosts。据我所知,它们是相同的权限。两条路径之间唯一不同的是用户。两个路径 (psaserv) 的组相同,但每个域都有不同的用户(Plesk 的限制)。【参考方案2】:

尝试使用mkdir($d, true)递归创建目录

<pre><?php 

$d = "d" . mt_rand(100, 500);

var_dump(
         array(
               get_current_user(),
               $d,
               mkdir($d,true),
               chmod($d, 0777),
               mkdir("$d/$d", true),
               chmod("$d/$d", 0777),
               fileowner($d),
               getmyuid()
              )
        );

【讨论】:

我试过了,但没什么区别。此外,这不是 WP 创建目录的方式(至少用于上传),我不想为了这么简单的事情分叉代码库。【参考方案3】:

尝试转到您的其他设置页面(或媒体,取决于您的版本)并确保上传目录仍然是 wp-content/uploads。

如果你需要。也设置完整的网址。

此外,作为最终解决方案,禁用将它们组织到文件夹中的选项,这样 WordPress 甚至不需要创建文件夹。

【讨论】:

您的最终解决方案确实有效,但是,它并没有解决根本问题:(如果我没有得到这个效果的答案,我一定会奖励你赏金。作为一方问题,你是在哪个主机上遇到这个问题的? 某客户的随机小商店。我不得不与房东一个接一个地解决问题,直到我最终说服客户在 2 年后搬到我的房东那里。奇怪的是,从那以后就没有那么多问题了。这可能是 PHP 安全模式的事情。我做了一些谷歌搜索,看到了一些将所有者设置为 nobody 的建议。这个线程有一堆关于它的帖子:wordpress.org/support/topic/254069 哦,我假设您尝试过这个,但是您是否递归地将脚本和文件夹显式设置为同一所有者? 是的,我有。 PHP 作为 apache:apache 运行并创建具有相同所有权的文件夹。问题是即使权限是rwxrwxrwx,PHP 也无法将上传的文件移动到它刚刚创建的文件夹中。在此特定域的某些父文件夹中的权限出现问题,但我找不到它是什么。【参考方案4】:

我最近在使用Joomla时遇到了类似的问题,通过将myuser添加到apache组,并将apache添加到psaserv组来解决问题。

【讨论】:

【参考方案5】:

我们在 Media Temple DV 上的一个网站遇到了这个问题。关闭 PHP 安全模式解决了它。目录仍被创建为 apache:apache,但媒体文件允许在其中。

【讨论】:

【参考方案6】:

发生在我身上的一件事 - WP 会告诉你即使所有权限都正确,它也不能将文件复制到/wp-content/upload....如果

upload_max_filesize

php.ini 中的文件太小(比如说 2M 而你尝试上传 3.5MB 的文件)!

希望对所有有正确权限但仍然无法上传的人有所帮助!

【讨论】:

【参考方案7】:

您的目录中不需要 777,最多 775 就足够了。只要确保它在上面所有其他目录的上传目录中设置为 755 即可。

此外,您可以尝试将其更改为 www-data,有时这会在您登录的 ftp 用户(例如每月更改一次权限时)没有足够的访问级别并拥有该用户的目录时会有所帮助阻止服务器写入它们。

最后,正如上面有人指出的那样,您可能需要提高上传大小限制,同时确保其他文件上传相关的 php.ini 设置正确:

http://php.net/manual/en/ini.core.php

http://kb.mediatemple.net/questions/137/How+can+I+edit+the+php.ini+file%3F#dv

【讨论】:

【参考方案8】:

解决方案是使用 FastCgi。这使得 PHP 以拥有该站点的用户身份运行。新文件和文件夹将是相同的用户和组。这将解决您的问题。

FastCgi 存在性能损失,但您会获得一些额外的安全性,因为它会限制 php。如果您要托管具有多个用户的多个网站,这可能是个好主意。

【讨论】:

【参考方案9】:

一个经常被忽视的常见原因是磁盘配额,即磁盘空间不足。

【讨论】:

以上是关于无法通过 Wordpress 上传器上传媒体的主要内容,如果未能解决你的问题,请参考以下文章

WAMP - 超过最大执行时间 - 无法再通过 Wordpress 媒体上传上传照片

带有大小选择的 WordPress 媒体上传器

javascript WordPress前端媒体上传器

覆盖 WordPress 媒体上传器的 saveCompat

将wordpress媒体上传器集成到插件中

需要一种方法来更改 wordpress 媒体上传器 div TB_window css