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
相关产品推荐
相关产品推荐

