Bird
Raised Fist0
Nginxdevops~5 mins

Wildcard and regex server names in Nginx - Commands & Configuration

Choose your learning style10 modes available
Introduction
When you want your web server to respond to many similar website names without listing each one, you can use wildcard or regex patterns. This helps handle groups of websites easily with fewer settings.
When you want to serve all subdomains of example.com like blog.example.com and shop.example.com with one configuration.
When you want to match any domain that starts with www and ends with .net, like www1.net or www-shop.net.
When you want to block or redirect requests from domains matching a pattern, such as all domains ending with .test.
When you want to catch all requests that do not match any specific server name and show a default page.
When you want to simplify configuration by using patterns instead of listing many similar domain names.
Config File - nginx.conf
nginx.conf
http {
    server {
        listen 80;

        # Wildcard server name to match all subdomains of example.com
        server_name *.example.com;

        location / {
            return 200 'Hello from wildcard subdomain!';
        }
    }

    server {
        listen 80;

        # Regex server name to match domains starting with www and ending with .net
        server_name ~^www.*\.net$;

        location / {
            return 200 'Hello from regex matched domain!';
        }
    }

    server {
        listen 80 default_server;

        # Default server for unmatched requests
        server_name _;

        location / {
            return 200 'Default server response';
        }
    }
}

This configuration has three servers:

  • The first uses a wildcard *.example.com to match any subdomain of example.com.
  • The second uses a regex ~^www.*\.net$ to match domains starting with 'www' and ending with '.net'.
  • The third is the default server that catches all other requests not matched by the above.

This setup shows how to use wildcard and regex server names in nginx to handle many domains efficiently.

Commands
Check the nginx configuration file syntax to make sure there are no errors before restarting the server.
Terminal
nginx -t
Expected OutputExpected
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Reload nginx to apply the new configuration without stopping the server.
Terminal
systemctl reload nginx
Expected OutputExpected
No output (command runs silently)
Send a request to nginx with the Host header set to blog.example.com to test the wildcard server name response.
Terminal
curl -s -H 'Host: blog.example.com' http://localhost
Expected OutputExpected
Hello from wildcard subdomain!
Send a request with a Host header matching the regex pattern to test the regex server name response.
Terminal
curl -s -H 'Host: www123.net' http://localhost
Expected OutputExpected
Hello from regex matched domain!
Send a request with a Host header that does not match any server name to test the default server response.
Terminal
curl -s -H 'Host: unknown.domain' http://localhost
Expected OutputExpected
Default server response
Key Concept

If you remember nothing else from this pattern, remember: nginx matches server names in order, using exact names first, then wildcards, then regex, so order and pattern type matter.

Common Mistakes
Using wildcard server names with a leading dot like .example.com instead of *.example.com
nginx does not recognize leading dot as a wildcard and will not match subdomains correctly.
Use an asterisk before the domain like *.example.com to match all subdomains.
Placing regex server names before exact or wildcard server names in the configuration
nginx processes server names in order and regex server names have lower priority, so placing them first can cause unexpected matches.
Place exact and wildcard server names before regex server names in the configuration.
Not escaping dots in regex server names, e.g., using ~^www.*.net$ instead of ~^www.*\.net$
Dots in regex match any character, so the pattern will match unintended domains.
Escape dots with double backslashes like \. to match literal dots.
Summary
Use *.example.com to match all subdomains of example.com with a wildcard server name.
Use ~^pattern$ syntax to define regex server names for flexible domain matching.
Always test nginx configuration with nginx -t before reloading to avoid errors.
Order server blocks carefully: exact names first, then wildcards, then regex.
Use a default server block to catch unmatched requests and avoid errors.

Practice

(1/5)
1. What does a wildcard server name like *.example.com match in nginx?
easy
A. Any domain ending with example.com, including example.com itself
B. Only the exact domain example.com
C. Any subdomain of example.com, like blog.example.com or shop.example.com
D. Only domains starting with a star character

Solution

  1. Step 1: Understand wildcard usage in server names

    A wildcard * before a domain matches any subdomain part, but not the root domain itself.
  2. Step 2: Apply to *.example.com

    This matches domains like blog.example.com or shop.example.com, but not example.com alone.
  3. Final Answer:

    Any subdomain of example.com, like blog.example.com or shop.example.com -> Option C
  4. Quick Check:

    Wildcard * matches subdomains only [OK]
Hint: Wildcard * matches subdomains, not the root domain [OK]
Common Mistakes:
  • Thinking wildcard matches the root domain
  • Confusing wildcard with regex syntax
  • Assuming wildcard matches any domain ending
2. Which of the following is the correct syntax to define a regex server name in nginx?
easy
A. server_name /www\d+\.example\.com/;
B. server_name *example.com;
C. server_name ^www\d+\.example\.com$;
D. server_name ~^www\d+\.example\.com$;

Solution

  1. Step 1: Recall regex server name syntax in nginx

    Regex server names start with a tilde ~ followed by the regex pattern.
  2. Step 2: Check each option

    server_name ~^www\d+\.example\.com$; uses ~^www\d+\.example\.com$ which is correct regex syntax. Others either miss the tilde or use invalid delimiters.
  3. Final Answer:

    server_name ~^www\d+\.example\.com$; -> Option D
  4. Quick Check:

    Regex server names start with ~ [OK]
Hint: Regex server names always start with ~ in nginx [OK]
Common Mistakes:
  • Omitting the ~ before regex pattern
  • Using * instead of ~ for regex
  • Using slashes / / as regex delimiters
3. Given this nginx config snippet:
server {
  server_name ~^www\d+\.example\.com$;
  return 200 'Matched regex server name';
}

What will be the response for a request to www12.example.com?
medium
A. Matched regex server name
B. 500 Internal Server Error
C. 404 Not Found
D. Default nginx welcome page

Solution

  1. Step 1: Understand the regex pattern

    The regex ^www\d+\.example\.com$ matches domains starting with 'www' followed by one or more digits, then '.example.com'.
  2. Step 2: Check if 'www12.example.com' matches

    'www12.example.com' matches the pattern because '12' are digits after 'www'.
  3. Final Answer:

    Matched regex server name -> Option A
  4. Quick Check:

    Regex matches www12.example.com [OK]
Hint: Check if domain fits regex pattern exactly [OK]
Common Mistakes:
  • Assuming regex matches partial strings
  • Ignoring start ^ and end $ anchors
  • Confusing regex with wildcard matching
4. You wrote this nginx config:
server {
  server_name ~www\d+\.example\.com$;
  return 200 'Hello';
}

Why is this regex server_name directive incorrect?
medium
A. Missing ^ anchor at start of regex
B. Regex server name must start with ~ and pattern must start with ^
C. Regex pattern missing delimiters like / /
D. Regex server name must start with ~ and pattern must be valid

Solution

  1. Step 1: Check regex server_name syntax

    Regex server names must start with ~ and the pattern should start with ^ to match from the beginning.
  2. Step 2: Identify missing ^ anchor

    The pattern www\d+\.example\.com$ lacks the ^ anchor, causing partial matches rather than full hostname matches.
  3. Final Answer:

    Regex server name must start with ~ and pattern must start with ^ -> Option B
  4. Quick Check:

    Regex patterns need ^ anchor at start [OK]
Hint: Regex patterns should start with ^ for nginx server_name [OK]
Common Mistakes:
  • Omitting ^ anchor in regex pattern
  • Thinking delimiters like / / are needed
  • Ignoring nginx error messages about regex
5. You want nginx to serve requests for any subdomain of example.com except www.example.com. Which server_name config achieves this?
hard
A. server_name ~^(?!www\.)[^.]+\.example\.com$;
B. server_name *.example.com www.example.com;
C. server_name ~^www\d+\.example\.com$;
D. server_name example.com *.example.com;

Solution

  1. Step 1: Understand the requirement

    We want to match any subdomain except 'www.example.com'. This requires a regex with negative lookahead.
  2. Step 2: Analyze options

    server_name ~^(?!www\.)[^.]+\.example\.com$; uses ~^(?!www\.)[^.]+\.example\.com$ which matches any subdomain not starting with 'www.'. Others either include 'www' or don't exclude it.
  3. Final Answer:

    server_name ~^(?!www\.)[^.]+\.example\.com$; -> Option A
  4. Quick Check:

    Negative lookahead excludes www subdomain [OK]
Hint: Use negative lookahead in regex to exclude specific subdomains [OK]
Common Mistakes:
  • Using wildcard that includes www.example.com
  • Not using regex for exclusion
  • Confusing wildcard and regex syntax
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard