skip to Main Content

I have multiple virtual hosts, managed by Nginx.

I received a ticket which asks me to validate the value of a request header for some virtual hosts and refuse serving requests if the header is absent or invalid. This is what I have added to each of the virtual hosts:

location / {
    if ($http_my_request_header_name != "<mytoken>") {
        return 406;
    }
}

And this is working as expected. However, I intend to make this solution more elegant and create a new config file, called common.conf, and, instead of pasting the same code into all virtual hosts, include this common file, as:

include conf.d/common.conf;

Yet, my tries were all failing:

First attempt

Pasting the if conditional and leave the location directive in the virtual host, which would include the file. The error I received was telling me in the logs that I cannot have an if by itself in the file.

Second attempt

I have moved the whole

location / {
    if ($http_my_request_header_name != "<mytoken>") {
        return 406;
    }
}

into the common file and replaced it with the include at the virtual host configs. The error I received was telling me that I need to wrap a server directive around the location directive.

Third attempt

I have wrapped a server directive around my location directive, but that errored out as well. I no longer have the error, because I destroyed the server since then and recreated it. But if the exact error message is needed, let me know, I will reproduce it and share it here then.

Question

How can I create a common config file that would validate for a request header and include it into multiple virtual host configs?

EDIT

In view of Rahul Sharma’s answer, I’m providing further information of the current try. This is how the main conf looks alike currently:

server {
...
    include conf.d/common.conf;
...
}

and the include is a direct child of the server directive, that is, nothing else is wrapped around the include. Earlier, instead of the include` line, the main conf had its content, like

server {
...
    location / {
        if ($http_my_request_header_name != "<mytoken>") {
            return 406;
        }
    }
...
}

and it worked. I have literally moved the location / to the common.conf file and replaced it with the include. So, Nginx dislikes my other file for some reason. This is why it was strange to me and this is what led me to ask this question.

2

Answers


  1. Chosen as BEST ANSWER

    It turned out that in nginx.conf there was a line of

    include /etc/nginx/conf.d/*.conf;
    

    which included common.conf at another place that I was not aware of and in that second place the code inside common.conf was invalid.


  2. I assume the contents of your conf.d/common.conf file is:

    location / {
        if ($http_my_request_header_name != "<mytoken>") {
            return 406;
        }
    }
    

    The error

    "location" directive is not allowed here in /etc/nginx/conf.d/common.conf

    is because probably your include statement inside the main nginx.conf is misplaced. The line include conf.d/common.conf; should be inside a server block for this to work like this:

    server {
        ...
        ...
        include conf.d/common.conf;
        ...
        ...
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search