1

我有一个 Apache 2.4.7 盒子,安装了 WordPress 4.1 并添加了一个插件,允许用户将图像添加到页面/帖子的评论(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]

<Directory>带有 WP 安装的指令是(带有混淆的 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 对身份验证模块和排序重要性等的更改修改了配置。
  • WordPress安装文件夹被正确递归地chown'ed
  • 上传文件夹的权限是 777'd,但并不重要,因为上传总是成功

这个问题出在哪里??

4

2 回答 2

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];

WPmedia_sideload_image函数使用curl获取图片,由于你的限制没有成功,然后返回preg_match_all函数无法处理的错误对象。

数据稍后保存在元数据中;它解释了为什么即使上传成功也不会保存参考。

Require local可能在您的开发服务器上不起作用,您可以尝试用其本地地址替换它。

于 2015-01-27T11:10:46.050 回答
0

我尝试Require ip <local-ip-of-box>按照johansatge的建议添加。虽然这不起作用,但它让我思考..

该框位于分配浮动公共 IP 的 Azure 中。令人讨厌的是,cURL 请求被退回并使用该公共 IP - 因为用于该框的域未添加到主机文件中。

解决方案是<domain-of-website-on-box>/etc/hosts.

于 2015-01-27T11:40:10.953 回答