diff options
author | Thomas Steur <tsteur@users.noreply.github.com> | 2020-08-18 09:27:07 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-18 09:27:07 +0300 |
commit | 17ec9004f99b6f7092740558bca71cca6c1ac23c (patch) | |
tree | c583444ac5e163641ac80ac185a8bec40824699c /core | |
parent | b5dd5fbdeaf855b55c2817352d5654d8aca0c64b (diff) |
Add feature to exclude tracking requests via config file (#16302)
Diffstat (limited to 'core')
-rw-r--r-- | core/Tracker/Request.php | 67 | ||||
-rw-r--r-- | core/Tracker/VisitExcluded.php | 8 |
2 files changed, 75 insertions, 0 deletions
diff --git a/core/Tracker/Request.php b/core/Tracker/Request.php index 98133e4319..93d64d0781 100644 --- a/core/Tracker/Request.php +++ b/core/Tracker/Request.php @@ -20,6 +20,7 @@ use Matomo\Network\IPUtils; use Piwik\Piwik; use Piwik\Plugins\UsersManager\UsersManager; use Piwik\ProxyHttp; +use Piwik\Segment\SegmentExpression; use Piwik\Tracker; use Piwik\Cache as PiwikCache; @@ -234,6 +235,72 @@ class Request return false; } + public function isRequestExcluded() + { + $config = Config::getInstance(); + $tracker = $config->Tracker; + + if (!empty($tracker['exclude_requests'])) { + $excludedRequests = explode(',', $tracker['exclude_requests']); + $pattern = '/^(.+?)('.SegmentExpression::MATCH_EQUAL.'|' + .SegmentExpression::MATCH_NOT_EQUAL.'|' + .SegmentExpression::MATCH_CONTAINS.'|' + .SegmentExpression::MATCH_DOES_NOT_CONTAIN.'|' + .preg_quote(SegmentExpression::MATCH_STARTS_WITH).'|' + .preg_quote(SegmentExpression::MATCH_ENDS_WITH) + .'){1}(.*)/'; + foreach ($excludedRequests as $excludedRequest) { + $match = preg_match($pattern, $excludedRequest, $matches); + + if (!empty($match)) { + $leftMember = $matches[1]; + $operation = $matches[2]; + if (!isset($matches[3])) { + $valueRightMember = ''; + } else { + $valueRightMember = urldecode($matches[3]); + } + $actual = Common::getRequestVar($leftMember, '', 'string', $this->params); + $actual = Common::mb_strtolower($actual); + $valueRightMember = Common::mb_strtolower($valueRightMember); + switch ($operation) { + case SegmentExpression::MATCH_EQUAL: + if ($actual === $valueRightMember) { + return true; + } + break; + case SegmentExpression::MATCH_NOT_EQUAL: + if ($actual !== $valueRightMember) { + return true; + } + break; + case SegmentExpression::MATCH_CONTAINS: + if (stripos($actual, $valueRightMember) !== false) { + return true; + } + break; + case SegmentExpression::MATCH_DOES_NOT_CONTAIN: + if (stripos($actual, $valueRightMember) === false) { + return true; + } + break; + case SegmentExpression::MATCH_STARTS_WITH: + if (stripos($actual, $valueRightMember) === 0) { + return true; + } + break; + case SegmentExpression::MATCH_ENDS_WITH: + if (Common::stringEndsWith($actual, $valueRightMember)) { + return true; + } + break; + } + } + } + } + + return false; + } /** * Returns the language the visitor is viewing. * diff --git a/core/Tracker/VisitExcluded.php b/core/Tracker/VisitExcluded.php index 265f8f12e8..d6b7705536 100644 --- a/core/Tracker/VisitExcluded.php +++ b/core/Tracker/VisitExcluded.php @@ -101,6 +101,14 @@ class VisitExcluded * These are of higher priority and should not be overwritten by plugins. */ + // Checking if in config some requests are excluded + if (!$excluded) { + $excluded = $this->request->isRequestExcluded(); + if ($excluded) { + Common::printDebug("Request is excluded."); + } + } + // Checking if the Piwik ignore cookie is set if (!$excluded) { $excluded = $this->isIgnoreCookieFound(); |