1

I have a location in nginx where GET and POST requests should go to different named locations. But this code doesn't work:

if ( $request_method = GET ) {
try_files /NON-EXISTENT @named_location_get
}

if ( $request_method = POST ) {
try_files /NON-EXISTENT @named_location_post
}

Because try_files is not allowed inside if.

Is there any other way to redirect request to named location, that would work inside if?

0
3

I don't know where this is documented, but I have seen configurations where a variable is used following the @ symbol, to make the named location conditional.

Use this with a map block and you can eliminate the if blocks.

I have tested this example:

map $request_method $name {
    GET      named_location_get;
    POST     named_location_post;
    default  named_location_other;
}
server {
    ...
    location ... {
        try_files nonexistent @$name;
    }
    location @named_location_get {
        ...
    }
    ...
}
1
  • Thanks, that's a working solution, using variables for named locations works. Unfortunately, the map directive works only on http config level, which makes it impossible to have different configurations for different locations and servers. For now I turned to using different fastcgi_pass inside if blocks, which is allowed in nginx. But the config still looks unbearably ugly. – Selivanov Pavel Sep 11 '20 at 22:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.