In .htaccess files, is there any difference at all between “!=on” and “off”
tl;dr In this example, the net result is the same, but the pattern !=on
is arguably more efficient because it is a lexicographical string comparison, not a regular expression. Unlike off
, which is processed as a regex.
However, in real terms there is no measurable performance difference between these particular expressions. It's a matter a personal preference which one you choose. (You could also use !on
instead.)
Apache’s use of a binary attribute...
This isn't strictly a "binary attribute". All Apache server variables contain strings. In the case of the HTTPS
server variable, this is set to either the string "on" or "off" (always lowercase).
RewriteCond %{HTTPS} !=on
(Note this has a different meaning to !on
.)
The
!
prefix (which can be prefixed to any condition) negates the result of the condition.The important part here is the
=
operator. This changes the expression from being a regex comparison to a lexicographical string comparison for equality. The fact that it is no longer a regex is what arguably makes it "more efficient" (although in real terms, there is no measurable performance difference in this example). So,=on
checks that the server variableHTTPS
is exactly equal to "on". The!
prefix then negates the result. Whereasoff
checks thatHTTPS
contains the string "off" anywhere (the same as^.*off.*$
).
The comparable expression to !=on
is really =off
, not off
(as in your example). And off
is comparable to !on
. The fact that you rarely see =off
is just human nature, personal preference, habit, copy/paste, readability, misunderstanding (take your pick)?
In summary:
# Check if HTTPS is not exactly equal to "on" (lexicographical comparison)
RewriteCond %{HTTPS} !=on
vs
# Check if HTTPS contains the string "off" anywhere (regex)
RewriteCond %{HTTPS} off