今天复习nginx发现默认虚拟主机有疑惑,网上有的blog认为server_name设置为""或_可以直接表示默认虚拟主机,不需要default_server,不知真假,但是我确实见过很多配置server_name为_的
测试1:server_name设置为_可以表示默认虚拟主机
配置
server1
server {
listen 80;
server_name www.wym1.com;
root /html/1;
location / {
index index.html;
echo "wym1";
}
}
server2
server {
listen 80;
server_name _;
root /html/2;
location / {
index index.html;
echo "wym2";
}
}
server3
server {
listen 80;
server_name www.wym3.com;
root /html/1;
location / {
index index.html;
echo "wym3";
}
}
访问该主机没有的www.wym2.com无法解析到_,反而解析到了nginx自带的站点
查看nginx.conf配置文件部分如下
server {
listen 80;
server_name localhost
location / {
root html;
index index.html index.htm;
}
}
include /usr/local/nginx/conf.d/*;猜测可能是因为隐式默认虚拟主机的原因,所以将include部分换到server前
include /usr/local/nginx/conf.d/*
server {
listen 80;
server_name localhost
location / {
root html;
index index.html index.htm;
}
}
果然是因为隐式默认虚拟主机的原因,匹配到了第一个server
可以发现,它定位到了www.wym1.com这个server而不是_,也就是说_没有匹配所有server的能力
测试2:server_name设置为""可以表示默认虚拟主机
基于测试1,仅需要修改server2
server2
server {
listen 80;
server_name "";
root /html/2;
location / {
index index.html;
echo "wym2";
}
}
与测试1结果相同,""不可以做默认站点
总结_与""本身是无法为默认server的,只有default_server可以指定默认server,但是他们本身没有意义,正好符合默认server默认匹配的逻辑意义,因此,应该在使用default_server的时候指定server_name为_或""
这也是为什么有的人认为使用_或""就行了,这是错误的,他们只看见了默认server大部分都使用_或""却忽略了default_server
补充:
显式与隐式虚拟主机
显式虚拟主机使用default_server指定
隐式虚拟主机是在没有指定default_server时,默认使用nginx在配置文件扫描到的第一个server做虚拟主机
本文著作权归作者 [ wymm ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。



