2010-06-04 157 views
6

这与在WordPress中上传媒体有关。无法通过WordPress上传文件上传媒体

每当WP为新上传文件创建一个文件夹(它按年和月组织上传:yyyy/mm)时,它会使用“apache:apache”用户和组创建它,并且可以全部访问(777或drwxrwxrwx 。)

然而,在那之后,WP不能在该文件夹内创建一个文件夹(例如:MKDIR 2011成功,但MKDIR 2011/01失败)。另外,上传不能移动到这些新创建的文件夹,即使权限是777( rwxrwxrwx

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

*我没有如果肯定这应该是这里或serverfault


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

drwxrwxrwx 5 myuser psaserv 4096 Jun 3 18:38 uploads 

这是由媒体寺(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],他们是每个路径相同。唯一不同的是用户。

+0

我曾经在Plesk服务器上使用WordPress一次出现过这个问题,从未想出如何修复它并结束将它移动到另一台主机。 – 2010-06-14 18:24:45

+0

该死的,我在同一条船上。这不是很有希望。 – 2010-06-15 01:14:52

回答

2

尝试将你的其他设置页面(或介质取决于您的版本),并确保上传目录仍的wp-content /上传。

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

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

+0

你的最终解决方案确实奏效,但是,它并没有解决根本问题:(如果我没有得到这个效果的答案,我肯定会奖励你的赏金。作为一个侧面的问题,你有什么主机这个问题在? – 2010-06-15 06:19:21

+0

一些随机的小店铺给客户,在与主持人问题之后,我不得不面对问题,直到我最终说服客户在2年后搬到我的主机,奇怪的是,没有那么多问题从那以后 这可能是一个PHP安全模式的事情。我做了一些谷歌搜索,并看到一些建议,将业主设置为“无人”。这个帖子有一堆关于它的帖子:http://wordpress.org/support/topic/254069 – 2010-06-15 06:23:52

+0

哦,我假设你已经试过了,但是你是否递归地将脚本和文件夹设置为同一个所有者? – 2010-06-15 06:26:48

1

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

+0

我试过我的示例脚本,其中包含'tmp'目录下有's',但我无法创建嵌套文件夹(请参阅我的编辑)。 – 2010-06-04 22:21:16

+0

两个域中的目录是否以相同的用户身份创建?将目录树与/进行比较。树上可能存在许可问题。 – BillThor 2010-06-05 01:00:50

+0

我比较了目录树一直到两个域都位于的'/ var/www/vhosts'。据我所知,他们是相同的权限。两条路径之间唯一不同的是用户。两个路径(psaserv)的组都是相同的,但每个域都有不同的用户(Plesk的限制)。 – 2010-06-05 01:39:50

1

尝试创建目录递归与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() 
      ) 
     ); 
+0

我试过了,但没有区别。此外,这不是WP如何创建目录(至少用于上传),而且我也不想为如此简单的代码分配代码库。 – 2010-06-04 22:52:17

1

我最近和Joomla有类似的问题,并且通过将myuser添加到apache组中并将apache添加到psaserv组中解决了这个问题。

+0

这看起来好像会起作用,但没有骰子:/ – 2010-06-16 06:44:03

1

Media Temple DV上的一个网站出现此问题。关闭PHP安全模式解决了它。目录仍然被创建为apache:apache,但是媒体文件被允许在那里。这发生在我

1

一两件事 - WP会告诉你,它可以文件n要复制到/wp-content/upload即使所有的权限是正确的....如果

upload_max_filesize

php.ini

是太小(说2M,你尝试上传3.5MB文件)!

希望能帮助所有拥有正确权限但仍无法上传的用户!

1

你的目录不应该需要777,最多775应该是足够的。只要确保它在上传目录中设置为755就可以用于上述所有其他目录。

此外,您可以尝试将其chown为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

3

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

FastCgi有一个性能损失,但你得到一些额外的安全性,因为它限制了PHP。如果您在多个用户主持多个网站,这可能是一个好主意。

1

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