我有一个带有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
是根据我的理解它应该涵盖本地框的所有内容。
我检查过的事情:
这个问题在哪里?
答案 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)条目。