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块

 

posted @ 2020-08-12 16:41  cptao  阅读(1377)  评论(0编辑  收藏  举报