leonbloy
leonbloy

Reputation: 75906

Regex patterns in Apache RewriteCond and friends: full or partial match?

Apache documentation states that

CondPattern is the condition pattern, a regular expression which is applied to the current instance of the TestString [...] CondPattern is a perl compatible regular expression with some additions [...]

And gives such examples as

RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]

I know about Perl regular expressions, but this seems confusing to me:

Are we speaking here of a partial match? (The pattern matches some substring inside the string, as in Perl $string =~ m/pattern/;?)

Or is rather it a full match? (The pattern matches the entire string, as in Java Pattern.matches(pattern, string)?)

If the match is partial, the trailing .* seems redundant. It it's full, then it's the ^ what seems redundant.

Many examples I've found, in the Apache docs and everywhere, have this (apparent to me) inconsistency.

Update: This was an issue with the docs, it's corrected now.

Upvotes: 12

Views: 16853

Answers (2)

Rich Bowen
Rich Bowen

Reputation: 202

Thanks. I've removed the unnecessary .* from the regular expressions I believe you were referring to in the docs. Please let me know if you find others, and I'll fix those, too.

Regular expressions are substring matches, by default, and don't need to match the entire string (usually). Places in the Apache docs that imply otherwise are errors, and need to be fixed.

People tend to throw .* into regular expressions all the time when they are completely unnecessary.

Upvotes: 8

ridgerunner
ridgerunner

Reputation: 34395

Partial. (The .* is redundant in the example.)

Apache uses the excellent PCRE library (although an older version - Rev: 5.0 2004 last time I checked), written by Phillip Hazel, which is very much Perl-like. But I agree, many of their examples leave much to be desired with regard to regex precision.

There are a few Apache-specific extensions, e.g. adding a leading ! to the pattern to apply NOT logic to the match. The best documentation I've found (which you've probably already seen), is this page: Apache Module mod_rewrite

Upvotes: 10

Related Questions