diff --git a/modules/caddyhttp/matchers.go b/modules/caddyhttp/matchers.go
index 508f78fd5..5ea606d3d 100644
--- a/modules/caddyhttp/matchers.go
+++ b/modules/caddyhttp/matchers.go
@@ -166,16 +166,30 @@ func (m MatchPath) Provision(_ caddy.Context) error {
 func (m MatchPath) Match(r *http.Request) bool {
 	lowerPath := strings.ToLower(r.URL.Path)
 	for _, matchPath := range m {
-		// as a special case, if the first character is a
-		// wildcard, treat it as a quick suffix match
-		if strings.HasPrefix(matchPath, "*") {
-			return strings.HasSuffix(lowerPath, matchPath[1:])
+		// special case: first character is equals sign,
+		// treat it as an exact match
+		if strings.HasPrefix(matchPath, "=") {
+			if lowerPath == matchPath[1:] {
+				return true
+			}
+			continue
 		}
+
+		// special case: first character is a wildcard,
+		// treat it as a fast suffix match
+		if strings.HasPrefix(matchPath, "*") {
+			if strings.HasSuffix(lowerPath, matchPath[1:]) {
+				return true
+			}
+			continue
+		}
+
 		// can ignore error here because we can't handle it anyway
 		matches, _ := filepath.Match(matchPath, lowerPath)
 		if matches {
 			return true
 		}
+
 		if strings.HasPrefix(lowerPath, matchPath) {
 			return true
 		}
diff --git a/modules/caddyhttp/matchers_test.go b/modules/caddyhttp/matchers_test.go
index 456942588..321d3ce7e 100644
--- a/modules/caddyhttp/matchers_test.go
+++ b/modules/caddyhttp/matchers_test.go
@@ -212,6 +212,21 @@ func TestPathMatcher(t *testing.T) {
 			input:  "/foo/bar/bam",
 			expect: false,
 		},
+		{
+			match:  MatchPath{"=/foo"},
+			input:  "/foo",
+			expect: true,
+		},
+		{
+			match:  MatchPath{"=/foo"},
+			input:  "/foo/bar",
+			expect: false,
+		},
+		{
+			match:  MatchPath{"=/foo"},
+			input:  "/FOO",
+			expect: true,
+		},
 		{
 			match:  MatchPath{"/foo"},
 			input:  "/FOO",