Modern web best practices strongly recommend using either www or non-www consistently, with HTTPS enforced. Having both versions accessible creates duplicate content issues for SEO and splits your analytics data. Here's how to properly configure this in Nginx.
For a simple HTTP to HTTPS and www to non-www redirect, add this server block to your Nginx configuration (usually in /etc/nginx/sites-available/yourdomain.conf):
server { listen 80; server_name www.example.com example.com; return 301 https://example.com$request_uri; }
For a production setup with SSL, you'll need two server blocks:
# Redirect all www and non-www HTTP to HTTPS non-www server { listen 80; server_name www.example.com example.com; return 301 https://example.com$request_uri; } # Main SSL configuration for non-www server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/your/certificate.crt; ssl_certificate_key /path/to/your/private.key; # Other SSL configurations... # Your main website configuration... }
Some special considerations for robust implementation:
# Additional protection against direct IP access server { listen 80 default_server; listen 443 ssl default_server; server_name _; return 444; } # Alternative if you prefer www version server { listen 443 ssl; server_name example.com; return 301 https://www.example.com$request_uri; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private.key; }
After making changes, always test your configuration:
sudo nginx -t # Test configuration sudo systemctl reload nginx # Apply changes
Verify with curl or your browser that all variations redirect properly:
curl -I http://example.com curl -I http://www.example.com curl -I https://www.example.com
When configuring web servers, duplicate content issues arise when both www.example.com and example.com serve identical content. Search engines treat these as separate websites, potentially harming SEO rankings. A permanent 301 redirect is the standard solution.
Here's the most efficient way to implement this in Nginx:
server {
listen 80;
listen [::]:80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 80;
listen [::]:80;
server_name example.com;
# Your primary server configuration here
root /var/www/example.com;
index index.html;
# Other directives...
}
For SSL/TLS configurations, you'll need to handle both HTTP and HTTPS redirects:
server {
listen 80;
listen [::]:80;
server_name www.example.com example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
# Primary SSL configuration
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# Your main site configuration...
}
After making changes:
sudo nginx -t
sudo systemctl reload nginx
Test using curl to verify the redirect works properly:
curl -I http://www.example.com
curl -I https://www.example.com
- Ensure your DNS has proper A/AAAA records for both www and root domain
- Verify SSL certificates cover both variants (or use wildcard certs)
- Check for infinite redirect loops when combining with other rules
- Update any hardcoded absolute URLs in your application
The redirect adds minimal overhead (typically <5ms). For optimal performance:
- Keep redirects at the web server level rather than application level
- Use keepalive connections to reduce TCP handshake overhead
- Ensure proper caching headers are set for the redirect response