有你在真好 的个人博客
nginx-二级域名泛解析server虚拟主机配置
阅读:2290 添加日期:2021/3/27 23:25:30 原文链接:https://www.toutiao.com/item/6428455606763389442/

把一个域名在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也是不太可靠的,当然就目前主流的浏览器大部分应该是没问题的。

ICP备案号:苏ICP备14035786号-1 苏公网安备 32050502001014号