Nginx 强大的正则表达式支持,可以使 server_name 的配置变得很灵活,如果你要做多用户博客,那么每个用户拥有自己的二级域名也就很容易实现了。
server_name 指令可以设置基于域名的虚拟主机,根据请求头部的内容,一个 ip 的服务器可以配置多个域名。多个域名之间以空格分隔。nginx 允许一个虚拟主机有一个或多个名字,也可以使用通配符 “*” 来设置虚拟主机的名字。
在 Nginx 中,同一个域名和同一个端口可以配置多个不同的 server 里面,同时,可以配置多个不同的 server_name。
server_name server_name1 server_name2;
使用环境
server
说明
server_name 配置多个域名时,以空格为分隔。
Nginx server_name匹配顺序
nginx 中的 server_name 指令主要用于配置基于名称虚拟主机,server_name 指令在接到请求后的匹配顺序分别为:
精准匹配
准确的 server_name 匹配,例如:
server { listen 80; server_name haicoder.net www.haicoder.net; ... }
开始通配符
以
*
通配符开始的字符串,例如:server { listen 80; server_name *.haicoder.net; ... }
结束通配符
以
*
通配符结束的字符串:server { listen 80; server_name www.*; ... }
正则匹配
匹配正则表达式,如下:
server { listen 80; server_name ~^(?.+)\.haicoder\.net$; ... }
nginx 将按照上面的顺序对 server name 进行依次匹配,只要有一项匹配以后就会停止搜索,所以我们在使用这个指令的时候一定要分清楚它的匹配顺序(类似于 location 指令)。
ServerName常用写法
nginx 绑定多个域名可又把多个域名规则写一个配置文件里,也可又分别建立多个域名配置文件,一般为了管理方便,每个域名建一个文件,有些同类域名也可又写在一个总的配置文件里。
每个域名一个文件写法
首先打开 nginx 域名配置文件存放目录:
/usr/local/nginx/conf/servers
,如要绑定域名www.haicoder.net
则在此目录建一个文件www.haicoder.net.conf
然后在此文件中写规则,如:server { listen 80; server_name www.haicoder.net; #绑定域名 index index.htm index.html index.php; #默认文件 root /home/www/haicoder.net; #网站根目录 include location.conf; #调用其他规则,也可去除 }
一个域名多个文件写法
一个文件添加多个域名的规则也是一样,只要把上面单个域名重复写下来就 ok 了,如:
server { listen 80; server_name www.haicoder.net; #绑定域名 index index.htm index.html index.php; #默认文件 root /home/www/haicoder.net; #网站根目录 include location.conf; #调用其他规则,也可去除 } server { listen 80; server_name m.haicoder.net; #绑定域名 index index.htm index.html index.php; #默认文件 root /home/www/m.haicoder.net; #网站根目录 include location.conf; #调用其他规则,也可去除 }
不带www域名加301跳转
如果不带 www 的域名要加 301 跳转,那也是和绑定域名一样,先绑定不带 www 的域名,只是不用写网站目录,而是进行 301 跳转,如:
server{ listen 80; server_name haicoder.net; rewrite ^/(.*) http://www.haicoder.net/$1 permanent;}
添加404网页
添加 404 网页,都可又直接在里面添加,如:
server { listen 80; server_name www.haicoder.net; #绑定域名 index index.htm index.html index.php; #默认文件 root /home/www/haicoder.net; #网站根目录 include location.conf; #调用其他规则,也可去除 error_page 404 /404.html; }
最后还有一个方法需要注意,可能有需要禁止 IP 直接访问 80 端口或者禁止非本站的域名绑定我们的 IP,这样的话应该如下处理,放到最前一个 server 上面即可:
server{ listen 80 default; server_name _; return 403;}
案例
servername匹配顺序
我们首先,将域名和我们的 nginx 所在服务器配置到我们 windows 的 host 文件中,具体配置如下:
192.168.80.128 www.haicoder.net192.168.80.128 haicoder.net192.168.80.128 m.haicoder.net
现在我们使用 vim 打开 nginx 的默认配置路径,具体命令如下:
vim /etc/nginx/conf.d/default.conf
我们执行如上命令,打开配置文件,接着,我们在 http 下面增加两个 server 配置,具体配置如下:
server { listen 80; server_name www.haicoder.net; #绑定域名 index index.html; #默认文件 root /home/www/haicodernet; #网站根目录}server { listen 80; server_name *.haicoder.net; #绑定域名 index index.html; #默认文件 root /home/haicoder.net; #网站根目录}
配置完毕后,如下图所示:
现在,我们重新加载配置文件,具体命令如下:
nginx -s reload
同时,我们在服务器的两个路径下分别新建两个 index.html 文件,现在,我们在浏览器访问
www.haicoder.net
,此时,浏览器输出如下:我们看到,此时匹配的是第一个 server,现在,我们输入
m.haicoder.net
域名,此时,浏览器输出如下:我们看到,此时匹配到了第二个 server。
Nginx servername配置总结
Nginx 强大的正则表达式支持,可以使 server_name 的配置变得很灵活,如果你要做多用户博客,那么每个用户拥有自己的二级域名也就很容易实现了。
server_name 指令可以设置基于域名的虚拟主机,根据请求头部的内容,一个 ip 的服务器可以配置多个域名。多个域名之间以空格分隔。nginx 允许一个虚拟主机有一个或多个名字,也可以使用通配符 “*” 来设置虚拟主机的名字。
在 Nginx 中,同一个域名和同一个端口可以配置多个不同的 server 里面,同时,可以配置多个不同的 server_name。