--- title: Why does my rule not match? weight: 50 --- Mixer rules must be valid to be applied at runtime. That means the match conditions are well-defined expressions in the [language](/docs/reference/config/policy-and-telemetry/expression-language/), the attributes are declared in an [attribute manifest](/docs/reference/config/policy-and-telemetry/attribute-vocabulary/), and rules have no dangling references to handlers and instances. The attribute values are typically normalized before evaluating rules on them. For example, HTTP headers have lowercase keys in `request.headers` and `response.headers` attributes. An expression `request.headers["X-Forwarded-Proto"] == "http"` does not match any request even though HTTP headers are case-insensitive. Instead, use an expression `request.headers["x-forwarded-proto"] == "http"`.