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

Nginx动态子域名转发至Docker容器站点的根目录配置问题

动态子域名匹配与站点根目录配置方案

要实现从请求域名中提取子域名部分,并动态设置容器内Nginx的站点根目录,你可以通过以下两种方式实现:


方法1:在server块直接用正则捕获子域名

修改容器内的Nginx配置,通过server_name的正则表达式直接捕获需要的子域名片段,再将该变量代入root路径:

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    # 正则匹配review-xxx.website.com格式的域名,捕获xxx部分存入subdomain变量
    server_name ~^review-(?<subdomain>.+)\.website\.com;

    # 动态设置根目录,使用捕获到的子域名变量
    root /home/site_reviews/$subdomain;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        # $realpath_root会自动对应动态设置的root路径,无需额外修改
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

方法2:用map指令统一处理子域名(更灵活)

如果需要对多个server块复用子域名提取逻辑,或者要设置默认 fallback 路径,可以在http块中添加map指令提前处理:

http {
    # 定义映射规则:从$host中提取子域名,匹配失败时默认使用main目录
    map $host $review_subdomain {
        ~^review-(?<sub>.+)\.website\.com$ $sub;
        default main;
    }

    server {
        listen 80;
        index index.php index.html;
        error_log  /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;

        # 直接使用map生成的变量设置根目录
        root /home/site_reviews/$review_subdomain;

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location / {
            try_files $uri $uri/ /index.php?$query_string;
            gzip_static on;
        }
    }
}

注意事项

  • 确保容器内对应目录(如/home/site_reviews/x34kk4ids)已创建,且Nginx进程拥有该目录的访问权限;
  • 正则表达式需和外部Nginx的规则保持一致,避免捕获错误内容;
  • 使用变量作为root时,Nginx不会在启动时检查目录是否存在,若需验证目录有效性,可结合try_files或自定义错误页处理。

内容的提问来源于stack exchange,提问作者DevMan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:12:46