2 variables inside if()?

Hello,

I’m trying to compare 2 variables, like so (I’ve made sure the variables
match):

if ($arg_hash !~ $sha1) { ... }

However in error.log it says:

*1 "$sha1" does not match "a78c3ecd2e349d1f1050fa555842a60b585489d8"

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.

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

Thanks very much.

Posted at Nginx Forum:

On 22 Out 2010 17h42 WEST, [email protected] wrote:

*1 "$sha1" does not match "a78c3ecd2e349d1f1050fa555842a60b585489d8"

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.

$sha1 is not set by Nginx during runtime. You’ve to set it in your
config:

Ex: set $sha1 a78c3ecd2e349d1f1050fa555842a60b585489d8

Then compare them in your conditional.

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

HTH,
— appa

Thank you very much for your reply,

I know for definite both variables are set and are the same, eg:

set $var1 'yes'; set $var2 'yes'; if ($var1 ~ $var2) { ... }

Returns:

*1 "$var2" does not match "yes"

So seems like the second variable is considered a string and not a
variable.

Posted at Nginx Forum:

Hello!

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

*1 "$sha1" does not match "a78c3ecd2e349d1f1050fa555842a60b585489d8"

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
expected.

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 If is Evil… when used in location context | NGINX page.

Maxim D.

Great, thank you very much Maxim, it works perfectly.

Posted at Nginx Forum: