2 variables inside if() ?

Maxim Dounin mdounin at mdounin.ru
Sat Oct 23 00:11:49 MSD 2010


On Fri, Oct 22, 2010 at 12:42:08PM -0400, untamed wrote:

> Hello,
> I'm trying to compare 2 variables, like so (I've made sure the variables
> match):
> [code]if ($arg_hash !~ $sha1) {
> ...
> }[/code]
> However in error.log it says:
> [code]*1 "$sha1" does not match
> "a78c3ecd2e349d1f1050fa555842a60b585489d8"[/code]
> I've tried swapping the variables over and the same error occurs, so it
> looks like the variable after the comparison character(s) is considered
> a string by nginx.

Right hand side is considered to be regular expression in "~" 
check, and compiled on configuration reading.  No variables are 

> Does anyone know of a way to do this? Or of a third party module which
> does this?

Any checks may be done within embedded perl.

In rewrite module you may do this by using combined variable and 
regexp with backreferences (see man pcresyntax for details):

    set $tt "$arg_hash:$sha1";

    if ($tt !~ "^([^:]+):\1$") {
        return 403;

Note well: before using "if" please make sure you've read and 
understand http://wiki.nginx.org/IfIsEvil page.

Maxim Dounin

More information about the nginx mailing list