nginx server_name匹配顺序
先叙述一下环境。
服务器Nginx上面配置了多个域名,其中域名是分散放在多个目录下,按业务来划分的,然后再 nginx.conf 中国通过include来引用。
最近新增一个业务,只 listen 80;不配置server_name,计划是让没有匹配到server_name的域名,通过此项配置来访问到后端的应用。该域名单独创建一个目录,并通过include配置到nginx.conf中,由于有多个include,新增的默认加到最后面。
想法很好,然而在测试的过程中发现了新的问题。访问某个不匹配的域名是,发现地址被强跳到了https,反复检查了新增的域名配置,并没有rewrite的操作,nginx.conf 也无异常。最后发现是include引用顺序的问题。第一个include中,某些server块中含有rewrite的配置。
可见,在寻找server_name的过程中,发现没有匹配到任何一个server_name,然后就默认走第一个server块,其中有rewrite的配置,因此出现了强跳https的情况。
在开始处理一个http请求时,nginx会取出header头中的host,与配置文件中每个server的server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。如果server_name 匹配失败,并且listen没有default属性,那么端口号和server的顺序将发挥作用,它会去找端口匹配的位置最靠前的server块。
最后说一下匹配顺序:
- 1、完全匹配
- 2、通配符在前的,如*.test.com
- 3、通配在后的,如www.test.*
- 4、正则匹配,如~^.www.test.com$
如果都不匹配:
- 1、优先选择listen配置项后有default或default_server的
- 2、如果没有配default或者default_server,则找到匹配listen端口的第一个server块