http请求头中host字段和nginx配置中的server_name指令有什么关系?
http请求中的host字段可能很少有人注意到, 即使注意到也知道他实际用处可能也不多. 今儿咱们就来说说这个host, 我相信这会颠覆很多人之前的认识.
假设有个nginx配置如下:
server {
listen 80;
server_name www.a.com;
return 200 '这是第一块server';
}
server {
listen 80;
server_name www.b.com;
return 200 '这是第二块server';
}
此时我们请求http://www.a.com, 这是大家熟悉的,会由第一块server处理.
而在上面基础上在请求时在请求头指定host: www.b.com ; 此时的结果会很出乎许多人的意外.该请求就会由第二块server处理.
你可能会纳闷为什么nginx没按照请求的地址http://www.a.com走?这就需要看下nginx处理机制.
经过查阅官网.原来,nginx处理一个请求时,决定由哪个server块处理请求是根据请求头中host字段来判断,和请求网址的域名并没有关系(只是当我们发起请求时,没有特意指定该host字段时, 请求客户端会自动帮我们计算,一般就是域名.). 此外值得留意的,如果请求头的host在nginx配置都不到一个对应server块, 那就是按照由于默认server块处理, 如果没有明确指定default server, 那么第一个server就是默认的. 更多的细节可见官网如下链接