You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
        }
    }
}

配置说明

  1. 域名到目录的映射:
    通过map指令将请求的$host(含www前缀的域名)提取出真实域名,直接映射到对应的站点根目录。default项指向一个不存在的目录,确保无匹配域名时返回404。

  2. www前缀处理:
    使用return 301替代原配置的rewrite,更高效地完成无www域名的重定向。

  3. 目录存在性校验:
    通过!-d $site_root判断当前域名对应的目录是否存在,不存在则直接返回404,完全符合“无对应目录则无法访问”的需求。

  4. 简化文件查找逻辑:
    直接将root设置为对应域名的子目录,Nginx会自动在该目录下查找请求的文件,无需额外的rewrite跳转,性能更优。

原配置的问题说明

原配置中@subdir_index的逻辑会在目录不存在时返回根目录的index.html,不符合“无法访问”的要求;同时通过rewrite跳转的方式不如直接设置root高效,容易引发路径匹配问题。

内容的提问来源于stack exchange,提问作者ajay.kumar.awscloud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:46:21