nginx-二级域名泛解析server虚拟主机配置

Nginx/Web服务器
427
0
0
2022-06-27
标签   Nginx基础

把一个域名在DNS那边做了泛解析。理论上一个域名可以有N个二级域名。比如有域名abcdomain.com,然后要配置N个二级域名,配置文件要N个server配置:

server {
  server_name abc.abcdomain.com;
  root /home/abcdomain.com/abc;
  index index.html index.php;
  ...
}
server {
  server_name xyz.abcdomain.com
  root /home/abcdomain.com/xyz;
  index index.html index.php;
  ...
}
server {
  server_name opq.abcdomain.com
  root /home/abcdomain.com/opq;
  index index.html index.php;
  ...
}

如果一个一个的去配置,麻烦不说,还会造成非常庞大的nginx配置文件,消耗了内存不说还会导致启动速度变慢。那么二级域名泛解析如何避免庞大的配置文件?nginx的server_name 的参数支持三种形式,可以是常量,就是直接域名字符串,也可以使用通配符,最重要的是可以使用正则表达式。

比如上面的这个我们可以配置成一个server:

server {
  server_name ~^(?<subdomain>[a-z0-9]+)\.abcdomain.com;
  root /home/abcdomain.com/$subdomain;
  index index.html index.php;
  ...
}

如果是不想匹配所有的主域名和子域名

server {
  server_name ~^(?<subdomain>[a-z0-9]+)\.(?<domain>[a-z0-9\-]+)\.(?<domext>[a-z]+);
  root /home/$domain.$domext/$subdomain;
  index index.html index.php;
  ...
}

但是,一定要注意,如果没做处理,php脚本收到的$_SERVER['SERVER_NAME' ]就这个正则表达式,你不是你认为的相应的域名,这会导致一系列的问题。那么如何让PHP可以获取到正确的域名呢?如果你使用的php-fpm,那么编辑

/usr/local/nginx/conf/fastcgi_params(注意,你的环境不一定是这个文件)

#fastcgi_param SERVER_NAME $server_name;
fastcgi_param SERVER_NAME $subdomain.$domain.$domext; 或
#fastcgi_param SERVER_NAME $host;

理论上,使用$host也是不太可靠的,当然就目前主流的浏览器大部分应该是没问题的。