# 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:
curl -H "Host: example.com" -I http://your-server/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.Check logs for specific error messages
- 2.Verify configuration settings
- 3.Test network connectivity
- 4.Review recent changes
- 5.Apply corrective action
- 6.Verify the fix
Understanding Server Name Matching
- 1.Nginx selects server blocks by:
- 2.Listening address (IP:port)
- 3.
server_namematching against Host header
- 1.Priority order:
- 2.Exact match:
server_name example.com - 3.Wildcard start:
server_name *.example.com - 4.Wildcard end:
server_name example.* - 5.Regex match:
server_name ~^(.+)\.example\.com$ - 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.List all server_names:
- 2.```bash
- 3.sudo nginx -T | grep "server_name"
- 4.
` - 5.Test Host header routing:
- 6.```bash
- 7.curl -H "Host: example.com" -I http://your-server/
- 8.curl -H "Host: www.example.com" -I http://your-server/
- 9.curl -H "Host: other.com" -I http://your-server/
- 10.
` - 11.Add diagnostic header:
- 12.```nginx
- 13.add_header X-Server-Block $server_name always;
- 14.add_header X-Host-Header $host always;
- 15.
` - 16.Check configuration:
- 17.```bash
- 18.sudo nginx -t
- 19.
` - 20.Watch which server handles requests:
- 21.```nginx
- 22.log_format server '$host -> $server_name [$time_local] $request';
- 23.access_log /var/log/nginx/server-matching.log server;
- 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
| Symptom | Cause | Fix |
|---|---|---|
| Wrong site loads | Missing server_name | Add server_name to all blocks |
| Unknown domains work | No default server | Set default_server explicitly |
| Subdomain not matched | Domain not in list | Add to server_name or use wildcard |
| Regex not matched | Wrong regex order | Put specific regex before general |
| HTTPS goes to wrong site | No HTTPS default | Set default for port 443 |
| HTTP/1.0 requests fail | No empty Host handler | Handle empty host in default |
| Arbitrary server picked | Duplicate server_name | Remove 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.
Related Articles
- [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>