WordPress评论图片插件在使用Apache需要时不保存上传的图像

时间:2015-01-27 10:50:36

标签: wordpress apache upload requires

我有一个带有WordPress 4.1安装的Apache 2.4.7包,并添加了一个插件,允许用户将图像添加到页面/帖子(https://wordpress.org/plugins/comment-images/)上的评论中。添加Require语句以限制对网站的访问时,图片上传功能不起作用(它是一个开发环境,因此需要进行有限的访问)。

图片上传实际上可以使用或不使用 Require指令但是添加指令时,对上传图片的引用无法获取正确保存到WordPress。

日志中的错误是:

PHP Warning:  preg_match_all() expects parameter 2 to be string, object given in /var/www/html/wp-content/plugins/comment-images/class-comment-image.php on line 480

我将传递的对象转储到文件中(序列化):

O:8:"WP_Error":2:{s:16:"^@WP_Error^@errors";a:1:{s:8:"http_404";a:1:{i:0;s:12:"Unauthorized";}}s:20:"^@WP_Error^@error_data";a:0:{}}

我输出了print_debug_backtrace()以显示通话。出于隐私原因,我不得不从阵列中删除评论数据:

#0  Comment_Image->save_comment_image(63)
#1  call_user_func_array(Array ([0] => Comment_Image Object ([] => 5000000,[] => ,[] => ),[1] => save_comment_image), Array ([0] => 63)) called at [/var/www/html/wp-includes/plugin.php:496]
#2  do_action(wp_insert_comment, 63, stdClass Object ()) called at [/var/www/html/wp-includes/comment.php:1941]
#3  wp_insert_comment(Array ()) called at [/var/www/html/wp-includes/comment.php:2083]
#4  wp_new_comment(Array ()) called at [/var/www/html/wp-comments-post.php:137]

安装WP的<Directory>的指令是(使用IP模糊处理):

AllowOverride All
<RequireAny>
    AuthType Basic
    AuthName "Restricted Access"
    AuthBasicProvider file
    AuthUserFile /var/www/.htpasswd
    Require valid-user
    Require user dev www-data
    Require ip xx.xx.xx.xx/xx
    Require ip xx.xx.xx.xx
    Require local
</RequireAny>

如果我添加Require all granted(或只删除Require指令),则该功能会按预期工作,并显示上传的图像。注意Require local是根据我的理解它应该涵盖本地框的所有内容。

我检查过的事情:

  • 根据Apache 2.4对auth模块的更改和排序重要性等修改了配置。
  • WordPress安装文件夹以递归方式正确显示
  • 上传文件夹的权限是777&#39; d,但不一定重要,因为上传总是成功

这个问题在哪里?

2 个答案:

答案 0 :(得分:0)

看起来插件无法很好地处理您的服务器无法自行下载图像的事实。

警告(class-comment-image.php on line 480)对应于此代码段:

$img_url = media_sideload_image( $comment_image_file['url'], $post_id );

preg_match_all( "#[^<img src='](.*)[^'alt='' />]#", $img_url, $matches );

$comment_image_file['url'] = $matches[0][0];

WP media_sideload_image函数使用curl来获取图像,并且由于你的限制它没有成功,然后返回preg_match_all函数无法处理的错误对象。

数据稍后会保存在元数据中;它解释了为什么即使上传工作也不保存引用。

Require local可能无法在您的开发服务器上运行,您可以尝试将其替换为本地地址。

答案 1 :(得分:0)

我按照johansatge的建议尝试添加Require ip <local-ip-of-box>。虽然这没有用,但它让我想到了。

该框位于Azure中,用于分配浮动公共IP。令人讨厌的是,cURL请求正在弹出并使用该公共IP - 因为用于该框的域未添加到hosts文件中。

解决方案是将<domain-of-website-on-box>添加到/etc/hosts中的loopback(127.0.0.1)条目。