- bounty将于明天到期**。回答此问题可获得+50的声望奖励。Robbie Lewis希望引起更多人关注此问题:寻找任何横向解决方案,这将有助于我们捕捉API请求进入一个Apache的Web服务器。
我有一个第三方应用程序,它通过REST API将产品数据插入WooCommerce。第三方应用程序不记录出站API请求。
第三方应用程序正在向WooCommerce发出请求,导致PHP错误。
[16-Jan-2023 14:52:23 UTC] PHP Fatal error: Uncaught TypeError: preg_match(): Argument #2 ($subject) must be of type string, WP_REST_Request given in /home/CENSORED/public_html/wp-includes/formatting.php:1596
Stack trace:
#0 /home/CENSORED/public_html/wp-includes/formatting.php(1596): preg_match('/[\\x80-\\xff]/', Object(WP_REST_Request))
#1 /home/CENSORED/public_html/wp-includes/formatting.php(2207): remove_accents(Object(WP_REST_Request))
#2 /home/CENSORED/public_html/wp-includes/class-wp-hook.php(310): sanitize_title(Object(WP_REST_Request))
#3 /home/CENSORED/public_html/wp-includes/plugin.php(205): WP_Hook->apply_filters(Object(WP_REST_Request), Array)
#4 /home/CENSORED/public_html/wp-includes/taxonomy.php(1751): apply_filters('pre_term_slug', Object(WP_REST_Request), 'pa_colour')
#5 /home/CENSORED/public_html/wp-includes/taxonomy.php(1653): sanitize_term_field('slug', Object(WP_REST_Request), 0, 'pa_colour', 'db')
#6 /home/CENSORED/public_html/wp-includes/taxonomy.php(2385): sanitize_term(Array, 'pa_colour', 'db')
#7 /home/CENSORED/public_html/wp-content/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-terms-controller.php(407): wp_insert_term('DENIM BLUE', 'pa_colour', Array)
#8 /home/CENSORED/public_html/wp-includes/rest-api/class-wp-rest-server.php(1171): WC_REST_Terms_Controller->create_item(Object(WP_REST_Request))
#9 /home/CENSORED/public_html/wp-includes/rest-api/class-wp-rest-server.php(1018): WP_REST_Server->respond_to_request(Object(WP_REST_Request), '/wc/v2/products...', Array, NULL)
#10 /home/CENSORED/public_html/wp-includes/rest-api/class-wp-rest-server.php(442): WP_REST_Server->dispatch(Object(WP_REST_Request))
#11 /home/CENSORED/public_html/wp-includes/rest-api.php(410): WP_REST_Server->serve_request('/wc/v2/products...')
#12 /home/CENSORED/public_html/wp-includes/class-wp-hook.php(308): rest_api_loaded(Object(WP))
#13 /home/CENSORED/public_html/wp-includes/class-wp-hook.php(332): WP_Hook->apply_filters(NULL, Array)
#14 /home/CENSORED/public_html/wp-includes/plugin.php(565): WP_Hook->do_action(Array)
#15 /home/CENSORED/public_html/wp-includes/class-wp.php(399): do_action_ref_array('parse_request', Array)
#16 /home/CENSORED/public_html/wp-includes/class-wp.php(780): WP->parse_request('')
#17 /home/CENSORED/public_html/wp-includes/functions.php(1332): WP->main('')
#18 /home/CENSORED/public_html/wp-blog-header.php(16): wp()
#19 /home/CENSORED/public_html/index.php(17): require('/home/CENSORED...')
#20 {main}
thrown in /home/CENSORED/public_html/wp-includes/formatting.php on line 1596
我认为PHP错误是一个需要报告给WooCommerce和/或WordPress的错误。我无法捕获请求的内容,以便我可以提供错误报告重现的步骤。
我正在测试WordPress和WooCommerce的完全空白和最新安装,没有其他插件(除了下面提到的)。
我试过:
- 查看Apache访问日志,请求主体未包含在内
- 使用此插件https://wordpress.org/plugins/wp-rest-api-log/,但不捕获请求。它捕获有效请求,但不捕获导致错误的请求
- 使用此插件https://wordpress.org/plugins/log-http-requests/似乎无法捕获REST API请求
- 使用此代码https://iandunn.name/2016/02/05/logging-wordpress-rest-api-errors/,当错误发生时,它不会向error_log添加任何内容。我向REST API发出了其他无效请求,它确实工作,所以我只能假设该请求在语法上是有效的REST API请求,导致的错误是内部PHP bug。
我如何捕获完整的请求,以便我可以确认这是一个WooCommerce或WordPress的错误,并报告给适当的github?
1条答案
按热度按时间6uxekuva1#
在这种特殊情况下,我建议使用“printf调试”或“
print_r
调试“。编辑
/home/CENSORED/public_html/index.php
并在第17行之前插入:根据插件触发的请求类型,内容应该出现在这些日志输出中的一个。
也可以转到
/home/CENSORED/public_html/wp-includes/formatting.php
并在第1596行之前插入:以获取格式错误的字符串变量。
执行此操作后,您应该能够通过以下方式在服务器的syslog中找到日志行:
如果你不幸没有访问服务器上的wp源代码,你应该通过Wireshark或TShark在运行插件的台式机上捕获请求。我不会责怪它矫枉过正。通过服务器IP过滤捕获,协议http和方法(
http.request.method == GET
或http.request.method == POST
),问题的核心应该很快就会揭晓(也许您必须将请求方案从https
重置为http
)。