# Nginx Server Name Not Matching

You configure multiple virtual hosts, but requests go to the wrong one. The wrong site loads, SSL certificates mismatch, or all requests hit the default server regardless of domain. Server name matching determines which server block handles a request, and incorrect configuration leads to unexpected routing.

Introduction

This article covers troubleshooting steps and solutions for How to Fix Nginx Server Name Not Matching. The error typically occurs in production environments and can cause service disruptions if not addressed promptly.

Symptoms

Common error messages include:

bash
curl -H "Host: example.com" -I http://your-server/
nginx
add_header X-Server-Name $server_name always;

```nginx server { listen 80; # No server_name - catches ALL requests root /var/www/default; }

server { listen 80; server_name example.com; root /var/www/example; } ```

Common Causes

  • Configuration misconfiguration
  • Missing or incorrect credentials
  • Network connectivity issues
  • Version compatibility problems
  • Resource exhaustion or limits
  • Permission or access denied

Step-by-Step Fix

  1. 1.Check logs for specific error messages
  2. 2.Verify configuration settings
  3. 3.Test network connectivity
  4. 4.Review recent changes
  5. 5.Apply corrective action
  6. 6.Verify the fix

Understanding Server Name Matching

  1. 1.Nginx selects server blocks by:
  2. 2.Listening address (IP:port)
  3. 3.server_name matching against Host header
  1. 1.Priority order:
  2. 2.Exact match: server_name example.com
  3. 3.Wildcard start: server_name *.example.com
  4. 4.Wildcard end: server_name example.*
  5. 5.Regex match: server_name ~^(.+)\.example\.com$
  6. 6.Default server (first or explicitly marked)

Check which server handles requests: ``bash curl -H "Host: example.com" -I http://your-server/

Add diagnostic header: ``nginx add_header X-Server-Name $server_name always;

Common Cause 1: Missing Server Name

Server block has no server_name, becomes default for all requests.

Problematic config: ```nginx server { listen 80; # No server_name - catches ALL requests root /var/www/default; }

server { listen 80; server_name example.com; root /var/www/example; } ```

Requests to other.com go to the first server (no server_name).

Solution: Define server_name for every block: ```nginx server { listen 80 default_server; server_name _; # Catch-all for unmatched hosts root /var/www/default; }

server { listen 80; server_name example.com; root /var/www/example; } ```

Common Cause 2: Wrong Default Server

Default server isn't explicitly set, first server becomes default.

Problematic config: ```nginx server { listen 80; server_name api.example.com; # First server becomes default for port 80 }

server { listen 80; server_name www.example.com; } ```

Requests to unknown domains go to api.example.com server.

Solution: Explicitly set default: ```nginx server { listen 80 default_server; server_name _; return 444; # Drop connection for unknown hosts }

server { listen 80; server_name example.com www.example.com; root /var/www/example; } ```

Common Cause 3: Server Name Mismatch

Host header doesn't match any server_name.

Diagnosis: ```bash # Check Host header sent curl -v http://example.com/ 2>&1 | grep "Host:"

# Check server_name configuration grep "server_name" /etc/nginx/sites-enabled/*

# Test different hosts curl -H "Host: wrong.com" -I http://your-server/ ```

Problem: Subdomain not listed: ``nginx server { listen 80; server_name example.com; # www.example.com not matched }

Solution: Add all domains: ``nginx server { listen 80; server_name example.com www.example.com *.example.com; }

Common Cause 4: Case Sensitivity Issues

Server_name matching is case-insensitive, but Host headers might vary.

This works correctly: ``nginx server_name Example.com; # Matches "example.com", "EXAMPLE.COM", "Example.com"

Nginx normalizes to lowercase for matching.

Regex matching is case-sensitive: ``nginx server_name ~^Example\.com$; # Only matches exact case "Example.com"

Solution: Case-insensitive regex: ``nginx server_name ~^example\.com$; # Lowercase anchor # or server_name ~^(?i)example\.com$; # Case-insensitive flag

Common Cause 5: Port-Specific Defaults

Default server only applies to specific port.

Problematic config: ```nginx server { listen 80 default_server; server_name _; }

server { listen 443; server_name example.com; # No default for 443 - this becomes default for 443 } ```

HTTPS requests to unknown domains go to example.com.

Solution: Set default for each port: ```nginx server { listen 80 default_server; server_name _; return 444; }

server { listen 443 default_server ssl; server_name _; ssl_certificate /etc/nginx/ssl/default.pem; ssl_certificate_key /etc/nginx/ssl/default.key; return 444; }

server { listen 80; listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key; root /var/www/example; } ```

Common Cause 6: Regex Priority Issues

Regex matches are checked in order of appearance, not specificity.

Problematic config: ```nginx server { listen 80; server_name ~\.example\.com$; # Matches all subdomains }

server { listen 80; server_name ~^www\.example\.com$; # Never matched - regex order } ```

First regex catches www.example.com.

Solution: Order regex by specificity: ```nginx server { listen 80; server_name ~^www\.example\.com$; # Most specific first }

server { listen 80; server_name ~^(.+)\.example\.com$; # Catch other subdomains } ```

Or use exact/wildcard instead of regex: ```nginx server { listen 80; server_name www.example.com; # Exact match has priority }

server { listen 80; server_name *.example.com; # Wildcard for others } ```

Common Cause 7: Wildcard Syntax Errors

Wildcard patterns have specific syntax requirements.

Invalid wildcards: ``nginx server_name www.*.example.com; # Invalid - wildcard only at start/end server_name *www.example.com; # Invalid - wildcard must be first server_name example.*.com; # Invalid - wildcard only at end server_name *.com; # Invalid - too broad (security risk)

Valid wildcards: ``nginx server_name *.example.com; # All subdomains server_name example.*; # example.com, example.net, etc. server_name .example.com; # example.com AND *.example.com

Common Cause 8: Host Header Missing or Empty

Some requests lack Host header (HTTP/1.0, some bots).

Problematic config: ``nginx server { listen 80; server_name example.com; }

HTTP/1.0 requests without Host go to default server.

Solution: Handle empty Host: ```nginx server { listen 80 default_server; server_name _ "";

# Reject requests without Host if ($host = "") { return 444; } }

server { listen 80; server_name example.com; } ```

Common Cause 9: Multiple Servers Same Name

Duplicate server_name in different blocks.

Problematic config: ```nginx # File A server { listen 80; server_name example.com; }

# File B server { listen 80; server_name example.com; # Duplicate } ```

Nginx picks one arbitrarily, may not be the one you expect.

Solution: Remove duplicates or use different ports: ``nginx # Single server for example.com server { listen 80; listen 443 ssl; server_name example.com; }

Diagnosis: ``bash grep -r "server_name example.com" /etc/nginx/sites-enabled/

Verification

  1. 1.List all server_names:
  2. 2.```bash
  3. 3.sudo nginx -T | grep "server_name"
  4. 4.`
  5. 5.Test Host header routing:
  6. 6.```bash
  7. 7.curl -H "Host: example.com" -I http://your-server/
  8. 8.curl -H "Host: www.example.com" -I http://your-server/
  9. 9.curl -H "Host: other.com" -I http://your-server/
  10. 10.`
  11. 11.Add diagnostic header:
  12. 12.```nginx
  13. 13.add_header X-Server-Block $server_name always;
  14. 14.add_header X-Host-Header $host always;
  15. 15.`
  16. 16.Check configuration:
  17. 17.```bash
  18. 18.sudo nginx -t
  19. 19.`
  20. 20.Watch which server handles requests:
  21. 21.```nginx
  22. 22.log_format server '$host -> $server_name [$time_local] $request';
  23. 23.access_log /var/log/nginx/server-matching.log server;
  24. 24.`

Complete Working Configuration

```nginx # Default server - reject unknown hosts server { listen 80 default_server; listen 443 default_server ssl; server_name _;

ssl_certificate /etc/nginx/ssl/default.pem; ssl_certificate_key /etc/nginx/ssl/default.key;

return 444; # Drop connection }

# Main site server { listen 80; listen 443 ssl; server_name example.com www.example.com;

ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key;

root /var/www/example;

add_header X-Server-Name $server_name; }

# API subdomain server { listen 80; listen 443 ssl; server_name api.example.com;

ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key;

location / { proxy_pass http://localhost:3000; } }

# Wildcard for other subdomains server { listen 80; listen 443 ssl; server_name *.example.com;

ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key;

return 301 https://example.com$request_uri; } ```

Verification

SymptomCauseFix
Wrong site loadsMissing server_nameAdd server_name to all blocks
Unknown domains workNo default serverSet default_server explicitly
Subdomain not matchedDomain not in listAdd to server_name or use wildcard
Regex not matchedWrong regex orderPut specific regex before general
HTTPS goes to wrong siteNo HTTPS defaultSet default for port 443
HTTP/1.0 requests failNo empty Host handlerHandle empty host in default
Arbitrary server pickedDuplicate server_nameRemove duplicates

Server name matching follows a priority order: exact > wildcard > regex > default. Ensure each server block has appropriate server_name and set explicit default servers for each port.

  • [Nginx troubleshooting: Fix Lambda Permission Denied - Complete ](fix-lambda-permission-denied)
  • [Nginx web server troubleshooting: Fix Client Max Body Size Large Upload Nginx Issue ](client-max-body-size-large-upload-nginx)
  • [Fix Apache 502 Proxy Error](fix-apache-502-proxy-error)
  • [Fix Apache LogLevel Core Debug Configuration](fix-apache-loglevel-core-debug)
  • [Fix Cloudflare 502 Bad Gateway Error](fix-cloudflare-502-bad-gateway)

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "How to Fix Nginx Server Name Not Matching", "description": "Troubleshoot Nginx server_name matching issues. Fix virtual host selection, default server, and domain routing configuration.", "url": "https://www.fixwikihub.com/fix-nginx-server-name-not-matching", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2025-11-28T07:35:26.418Z", "dateModified": "2025-11-28T07:35:26.418Z" } </script>