```html
When configuring Nginx to serve individual static files like robots.txt
, favicon.ico
, or sitemap.xml
, both root
and alias
directives can achieve similar results - but with crucial technical distinctions:
# Using alias (exact file path)
location /robots.txt {
alias /home/www/static/robots.txt;
expires 1d;
}
# Using root (directory path)
location /robots.txt {
root /home/www/static;
expires 1d;
}
Path Resolution:
alias
completely replaces the matched path segment (/robots.txt
) with the specified file pathroot
appends the full request URI to the directory path
Common Pitfall Example:
# INCORRECT alias usage (double path)
location /static/ {
alias /home/www/static/; # Will try to serve from /home/www/static/static/
}
# CORRECTED version
location /static/ {
alias /home/www/static/;
}
The alias
directive requires careful path specification to prevent directory traversal vulnerabilities:
# Secure configuration for alias
location ~ ^/(robots\.txt|favicon\.ico)$ {
alias /home/www/secure_static/$1;
add_header X-Content-Type-Options "nosniff";
}
For high-traffic scenarios, consider this optimized setup:
location = /robots.txt {
root /home/www/static;
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
Use alias when:
- Serving files outside the default document root
- Mapping URLs to completely different filesystem paths
- Need precise control over the exact file location
Use root when:
- Files are within the standard directory structure
- Maintaining consistent path relationships
- Working with location blocks that match directory patterns
For complex static file handling with cache control:
location ~* ^/(robots\.txt|humans\.txt|crossdomain\.xml)$ {
alias /home/www/domain_configs/$1;
access_log off;
log_not_found off;
expires max;
add_header Cache-Control "public";
etag on;
}
While both directives can serve static files, their path resolution differs fundamentally:
# alias - replaces the matched URI segment with specified path
location /robots.txt {
alias /home/www/static/robots.txt; # full file path required
}
# root - prepends the specified path to the URI
location /robots.txt {
root /home/www/static; # directory path only (trailing slash optional)
}
Directory traversal risks: alias may expose parent directories if misconfigured:
# UNSAFE configuration example:
location /static/ {
alias /home/www/static/;
}
# Requests to /static/../ would traverse outside web root
root is generally safer as it anchors paths within the specified directory.
Both directives perform similarly for single files, but alias shows advantages when:
- Serving files from multiple non-standard locations
- Mapping complex URL structures to filesystem paths
For single files:
# Recommended approach for robots.txt/humans.txt/favicon.ico
location = /robots.txt {
root /home/www/static;
expires 24h;
add_header Cache-Control public;
}
For directory mappings:
# Preferred method for directory serving
location /assets/ {
root /home/www/static;
# Additional directives...
}
Permission problems: Ensure Nginx worker process has read access:
sudo chown -R www-data:www-data /home/www/static
sudo chmod -R 755 /home/www/static
Cache headaches: Always test with curl to bypass browser caching:
curl -I http://yoursite.com/robots.txt
For serving individual static files like robots.txt:
- Use
root
when files reside in standard locations - Prefer
alias
only when needing non-standard path mapping - Always include the
=
modifier for exact matching