Nginx配置$host与同名子目录自动映射的需求及方案
Nginx自动映射域名到对应子目录配置方案
需求回顾
服务器/var/www/html目录下存在多个以完整域名命名的子目录:
/var/www/html/abc.example.com /var/www/html/cde.example.com /var/www/html/ghi.example.com
需要实现:
- 访问
abc.example.com时自动对应到同名子目录 - 新增域名子目录无需修改Nginx配置
- 访问无对应子目录的域名时直接拒绝访问(返回404)
优化后的配置代码
map $host $site_root { ~^(www\.)?(?<domain>.+)$ /var/www/html/$domain; default /var/www/html/invalid; # 不存在的目录,用于触发404 } server { listen 80; server_name _; # 可选:移除www前缀,永久重定向到无www域名 if ($host ~* ^www\.(.*)$) { return 301 $scheme://$1$request_uri; } root $site_root; location / { try_files $uri $uri/ /index.html =404; # 校验域名对应的目录是否存在,不存在则返回404 if (!-d $site_root) { return 404; } } }
配置说明
域名到目录的映射:
通过map指令将请求的$host(含www前缀的域名)提取出真实域名,直接映射到对应的站点根目录。default项指向一个不存在的目录,确保无匹配域名时返回404。www前缀处理:
使用return 301替代原配置的rewrite,更高效地完成无www域名的重定向。目录存在性校验:
通过!-d $site_root判断当前域名对应的目录是否存在,不存在则直接返回404,完全符合“无对应目录则无法访问”的需求。简化文件查找逻辑:
直接将root设置为对应域名的子目录,Nginx会自动在该目录下查找请求的文件,无需额外的rewrite跳转,性能更优。
原配置的问题说明
原配置中@subdir_index的逻辑会在目录不存在时返回根目录的index.html,不符合“无法访问”的要求;同时通过rewrite跳转的方式不如直接设置root高效,容易引发路径匹配问题。
内容的提问来源于stack exchange,提问作者ajay.kumar.awscloud
相关产品推荐
相关产品推荐

