这些似乎是PCRE引擎的内部设置,以限制尝试将某些文本匹配到某个模式所花费的最大内存/时间。该手册pcreapi
页很少用外行的术语进行解释:
match_limit字段提供了一种防止PCRE在运行不匹配但在其搜索树中具有大量可能性的模式时消耗大量资源的方法。经典示例是使用嵌套的无限重复。
在内部,PCRE使用一个称为match()的函数,该函数会反复调用(有时是递归调用)。match_limit设置的限制是在比赛期间调用此函数的次数所施加的,其作用是限制可以发生的回溯量。对于未锚定的模式,对于主题字符串中的每个位置,计数从零重新开始。
生成PCRE时可以设置限制的默认值。默认的默认值是1000万,可以处理除最极端情况以外的所有情况。您可以通过为pcre_exec()提供一个pcre_extra块来覆盖默认值,该块中设置了match_limit,并且在flags字段中设置了PCRE_EXTRA_MATCH_LIMIT。如果超出限制,则pcre_exec()返回PCRE_ERROR_MATCHLIMIT。
match_limit_recursion字段与match_limit相似,但是它不限制match()调用的总次数,而是限制了递归的深度。递归深度小于总调用数,因为并非对match()的所有调用都是递归的。仅当此限制设置为小于match_limit时,该限制才有用。
由于PCRE库的内置默认值为10000000,因此我猜测建议为mod_security使用较低的设置,以防止长时间搁置请求。