NGINX If This AND That
Overview
I was working on an NGINX site recently and came across something odd. NGINX doesn’t allow the ability to check multiple conditionals in a single statement. I wanted to be able to force HTTPS for all directories except two. I thought I could write something like this (psuedo code), but NGINX complained
if ($uri != 'firmware') and ($uri != 'provision') {
# Force HTTPS
}
Configuration
In the end, I found a hacky way of doing it. This is the code sets prov_test to 0, then checks if the URI is fw or provision. If the URI is fw or provision, it sets prov_test to 1. Prov_test is checked at the end to see if HTTPS should be set or not.
server {
listen 80;
server_name fusionpbx;
set $prov_test 0;
if ($uri ~* ^.*provision.*$) {
set $prov_test 1;
}
if ($uri ~* ^.*/fw/.*$) {
set $prov_test 1;
}
if ($prov_test != 1) {
rewrite ^(.*) https://$host$1 permanent;
break;
}