nginx
中的 server_name
指令主要用于配置基于名称的虚拟主机,server_name
指令在接到请求后的匹配顺序分别为:
- 1.精确匹配
server {
listen 80;
server_name sherlocky.com www.sherlocky.com;
...
}
- 2.通配符开始匹配
server {
listen 80;
server_name *.sherlocky.com;
...
}
- 3.通配符结束匹配
server {
listen 80;
server_name www.*;
...
}
- 4.正则表达式匹配
server {
listen 80;
server_name ~^(?.+)\.sherlocky\.com$;
...
}
nginx
将按照 1, 2, 3, 4 的顺序对 server name
进行匹配,只有有一项匹配以后就会停止搜索(类似于 location
指令)。
利用 server_name
指令正则表达式的捕获功能,可以尽量精简配置文件。
such as:
- 1.在一个
server
块中配置多个站点:
server {
listen 80;
server_name ~^(www\.)?(.+)$;
index index.php index.html;
root /data/www/$2;
}
站点的主目录应该类似于这样的结构:
/data/www/sherlocky.com
/data/www/nginx.org
/data/www/google.com
这样就可以只使用一个 server
块来完成多个站点的配置。
- 2.在一个
server
块中为一个站点配置多个二级域名
实际网站目录结构中我们通常会为站点的二级域名独立创建一个目录
server {
listen 80;
server_name ~^(.+)?\.sherlocky\.com$;
index index.html;
if ($host = sherlocky.com){
rewrite ^ http://www.sherlocky.com permanent;
}
root /data/www/sherlocky.com/$1/;
}
站点的目录结构应该如下:
/data/www/sherlocky.com/www/
/data/www/sherlocky
.com/nginx/
这样访问 www.sherlocky.com
时 root
目录为 /data/www/sherlocky.com/www/
,
访问nginx.sherlocky.com
时为 /data/www/sherlocky.com/nginx/
,以此类推。
if
语句的作用是将 sherlocky.com
重定向到 www.sherlocky.com
,这样既解决了网站的主目录访问,又可以增加 seo
中对 www.sherlocky.com
的域名权重。
upstream 带下划线问题
详情可参考:用了10多年的 Tomcat 居然有bug,这能忍? ,如果地址失效可访问:400 问题(难道是tomcat的bug?)
tomcat 遵循 RFC1-1034 的规范,不允许带有下划线的Host(domain name)。
https://www.ietf.org/rfc/rfc1034.txt
可通过在 Nginx 中配置proxy_set_header HOST $host
解决或者修改 upstream 为不带下划线。
评论区